Mit Forge nen ServerTickHanlder erstellen.
Achtung Pseudocode der besonderen Art:
Code:onTick(){ for(server.getPlayerEntities()){ if(player.dimension == myDimension.id){ if(world.getBlock(player.position).id != myBlock.id){ player.hurt(); } } } }
Ich habe zur Zeit ein kleines Problem. Und zwar will ich, dass ein Spieler in einer von mir erstellten Dimension Schaden bekommt, solange er sich nicht innerhalb eines bestimmten Blocks befindet.
Wie man abfragt in welcher Dimension sich ein Spieler befindet weiß ich. Wie man einen Spieler verletzt weiß ich auch. Das Problem ist nur, dass ich das ganze ja auch irgendwie aufrufen lassen muss.
Meine erste Idee war die gesamte Dimension mit von mir erstellten Blöcken zu fluten, die den Spieler verletzen, wenn er sich innerhalb eines solchen Blocks befindet. Das führt aber zu enormen Frame einbrüchen.
Gibt es noch eine andere möglichkeit eine Methode alle paar Sekunden für alle Spieler in einer Dimension aufzurufen?
Mit Forge nen ServerTickHanlder erstellen.
Achtung Pseudocode der besonderen Art:
Code:onTick(){ for(server.getPlayerEntities()){ if(player.dimension == myDimension.id){ if(world.getBlock(player.position).id != myBlock.id){ player.hurt(); } } } }
Danke erstmal für den Tipp, aber ich bekomme es irgendwie nicht hin.
Ich habe mir eine Klasse erstellt, die das Interface ITickHandler implementiert. Dann habe ich in der Hauptklasse meiner Mod ein Objekt dieser Klasse erstellt und es mit
registriert.Code:TickRegistry.registerTickHandler(serverTickHandler, Side.SERVER);
Aber die Mehtode
In meinem TickHandler wird nicht aufgerufen.Code:public void tickStart(EnumSet<TickType> type, Object... tickData) {}
Ist es nicht am einfachsten eine Vergiftung zu benutzen?
Du wirst in der Dimension ständig vergiftet und in der nähe der bestimmten blöcke wird das Gift gelöscht
@Marlor
Das wäre sicherlich eine Möglichkeit, würde aber thematisch nicht zu meiner Mod passen. Außerdem hätte ich dann doch das selbe Problem. Ob ich den Spieler nun vergifte oder direkt verletze spielt doch keine Rolle.
Thema ist ja wohl egal ob der buff jetzt vergiftung verstrahlung oder luftmangel heißt
Dann gibst du dem spieler wenigstens feedback.
Sonst kommt der schaden ja von irgentwoher ohne das der Spieler weis was es damit aufsich hat.
Ich glaub auch das es einfacher umzusetzen ist da das Buffsystem ja schon implementiert ist
Mein Problem ist ja nicht, dass ich nicht weiß, wie ich den Spieler verletzen soll, sondern wie ich die Methode aufrufe, die den Spieler verletzt. Ob diese Methode den Spieler verletzt, vergiftet oder verbrennt ist ja letztendlich egal. Von daher sehe ich nicht, wie mir das mit meinem Problem weiterhelfen soll.
Außerdem habe ich es doch schon fast hinbekommen. Aus irgendeinem Grund wird mein TickHandler nur nicht richtig erkannt.
Und da du nicht wusstest wie man die Methode aufrufst hab ich dir den Tip mit dem Buff gegeben den kannst du überall aufrufen
Ich glaube wir reden immer noch aneinander vorbei. Den Spieler kann ich auch überall verletzen. Einfach mit
Die Frage ist nur, wie sorge ich dafür, dass dieser Codeschnipsel auch alle paar Sekunden aufgerufen wird?Code:for(int i = 0; i < playerArray.length; i++){ if(playerArray[i].dimension == 22){ playerArray[i].setEntityHealth(playerArray[i].getHealth() - 1); } }
@Gnoccy
Da scheint nur was am registrieren des Tickhandlers falschgelaufen zu sein, du darfst den Tickhandler nicht im CommonProxy registrieren sondern in der Modklasse an sich, gib mal vollständigen Code, der Tickhandlerklasse und der ModKlasse.
@Marlor
Dann hätte man immernoch das Problem sekündlcih zu checken ob sich der Spieler innerhalb des beasagten Blocks oder überhaupt in der Dimension befindet.