Add Bow Damge and Fire #261
Label
Kein Label
Bug
Codeverbesserung
Einsteiger Freundlich
Idee
In Arbeit
Neues Feature
Prio A
Security Breach
Überprüfung notwendig
Verbesserung
Zu Beobachten
Kein Meilenstein
Niemand zuständig
3 Beteiligte
Fällig am
Kein Fälligkeitsdatum gesetzt.
Abhängigkeiten
Keine Abhängigkeiten gesetzt.
Referenz: SteamWar/FightSystem#261
Laden…
In neuem Issue referenzieren
Einen Benutzer sperren
Keine Beschreibung angegeben.
Branch "record_extension" löschen
Das Löschen eines Branches ist permanent. Obwohl der Branch für eine kurze Zeit weiter existieren könnte, kann diese Aktion in den meisten Fällen NICHT rückgängig gemacht werden. Fortfahren?
@ -114,1 +146,4 @@
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
public void onEntityDamage(EntityDamageEvent e) {
if(e.getCause() == EntityDamageEvent.DamageCause.FIRE_TICK || e.getCause() == EntityDamageEvent.DamageCause.FIRE ||e.getEntity().getFireTicks() > 0)
RecordSystem.setOnFire(e.getEntity(), false);
Warum wird hier das Entity gelöscht, wenn der Cause entweder EntityDamageEvent.DamageCause.FIRE_TICK oder EntityDamageEvent.DamageCause.FIRE oder der fireTick des entities > 0 ist? Kannst du das einmal erklären?
Das ist nicht gelöcht, dass ist eine Flag, die angibt ob das Feuer Permanent oder für 21 Ticks ist.
@ -229,2 +276,4 @@
return fp == null || !fp.isLiving() || FightState.getFightState() == FightState.SPECTATE;
}
Wofür sind diese Änderungen?
@ -68,1 +67,3 @@
*
* BowSpanPacket (0x0A) + int EntityId + boolean start + int hand
* PlayerDamagePacket (0x0B) + int EntityId
* SetOnFire (0x0C) + int EntityId + boolean perma
Dieses Packet kommt mir nicht ganz richtig vor, FireTick ist doch eine sache, welche zufällig weggeht, somit ist es nicht deterministisch, also weiß ich nicht, ob das abspielen dieser nicht dann mal länger und mal kürzer ist, was nicht im Sinne des Packets sein dürfte.
Deshalb wird der FireTick auch, wenn die perma flag auf false ist, nur für 21 Ticks abgespielt, somit ist relativ genau, kann aber noch max. 1 Sekunde off sein.
@ -172,6 +175,27 @@ public class RecordSystem {
spawnEntity(e);
}
public static synchronized void bowSpan(Entity e, boolean start, int hand) {
Das BowSpan hat doch mehrere stadien, reicht da einfach ein boolean für? Und wie ist das mit der Hand wofür genau brauchst du diese, weil du weißt doch den slot, den du gerade hälst.
Würde hier nicht einfach ein Boolean reichen, für mainHand?
Die "Stadien" die das Bogen Spannen hat werden Client Seitig berechnet.
@ -73,1 +76,4 @@
}.register();
//Bow Listener
ProtocolLibrary.getProtocolManager().addPacketListener(new PacketAdapter(FightSystem.getPlugin(), PacketType.Play.Client.BLOCK_PLACE) {
Unsauber, das hier zu Registrieren. Ggf. wäre es sinnvoll, einen PacketAdapterStateDependent neu einzuführen, ansonsten das bitte hier als StateDependent registrieren (und wieder entregistrieren).
Dann läuft das nicht mit, wenn es nicht benötigt wird.
Falls du eine Idee brauchst, wie das geht, schau mal im TechHider nach.
@ -74,0 +84,4 @@
Player p = event.getPlayer();
if(!((hand == EnumWrappers.Hand.MAIN_HAND && p.getInventory().getItemInMainHand().getType() == Material.BOW) ||
(hand == EnumWrappers.Hand.OFF_HAND && p.getInventory().getItemInOffHand().getType() == Material.BOW)))
Bogen kann nur gespannt werden, wenn der Bogen in der Haupthand ist. Armbrüste könnten ggf. noch problematisch sein, genauso weiß ich nicht, ob das Material genau so seit der 1.8 hieß.
@ -74,0 +87,4 @@
(hand == EnumWrappers.Hand.OFF_HAND && p.getInventory().getItemInOffHand().getType() == Material.BOW)))
return;
RecordSystem.bowSpan(p, true, hand != EnumWrappers.Hand.MAIN_HAND);
Bögen können immer nur in der MainHand gespannt werden.
@ -113,2 +145,4 @@
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
public void onEntityDamage(EntityDamageEvent e) {
if(e.getCause() == EntityDamageEvent.DamageCause.FIRE_TICK || e.getCause() == EntityDamageEvent.DamageCause.FIRE ||e.getEntity().getFireTicks() > 0)
Bitte das ganze erst nach den Prüfungen senden, wenn klar ist, dass dieser Spieler/Entity überhaupt gesendet wird!
@ -172,6 +175,27 @@ public class RecordSystem {
spawnEntity(e);
}
public static synchronized void bowSpan(Entity e, boolean start, boolean offHand) {
Bögen kann man nur in der MainHand spannen? (Meines wissens nach?)
@ -175,0 +189,4 @@
Recorder.flush();
}
public static synchronized void setOnFire(Entity e, boolean perma) {
Gibt es überhaupt permafeuer, wenn ja, wo?
@ -71,6 +101,17 @@ public class Recording implements Listener {
despawnTNT();
}
}.register();
new StateDependent(Config.recording(), FightState.All) {
Warum willst du den Bogen Listener immer haben? Ist das nicht etwas unnütz, weil wann genau im Fight hat man einen Bogen? Ich glaube nur im prepare und im Fight selber. Also kann man das hier doch nocht optimieren?
@ -115,0 +158,4 @@
return;
if(e.getCause() == EntityDamageEvent.DamageCause.FIRE_TICK || e.getCause() == EntityDamageEvent.DamageCause.FIRE)
RecordSystem.setOnFire(e.getEntity(), false);
Warum setzt du das Entity erst onFire und checkest dann erst, ob es zu senden ist. Das sollte man doch nur, wenn es gesendet werden muss!
@ -115,0 +173,4 @@
if(e.getEntityType() != EntityType.PLAYER)
return;
RecordSystem.setOnFire(e.getEntity(), false);
Hier ignorierst du ob der Spieler zu senden ist?
@ -385,3 +385,3 @@
}
public static boolean recording(){
return mode == ArenaMode.EVENT;
return true;//mode == ArenaMode.EVENT;
Nope!
@ -55,0 +67,4 @@
return;
RecordSystem.bowSpan(p, true, hand != EnumWrappers.Hand.MAIN_HAND);
ProtocolLibrary.getProtocolManager().addPacketListener(new PacketAdapter(FightSystem.getPlugin(), PacketType.Play.Client.BLOCK_DIG) {
ARRRGG! Nicht für jedes Paket einen PacketListener registrieren! Bitte nicht! (Musst halt ein Set einbauen, wer gerade den Bogen gezogen hat, aber das bitte nicht!