Add Bow Damge and Fire #261
@ -347,7 +347,7 @@ public class Config {
|
|||||||
EventTeamRedID = 0;
|
EventTeamRedID = 0;
|
||||||
BothTeamsPublic = true;
|
BothTeamsPublic = true;
|
||||||
MaximumTeamMembers = Integer.MAX_VALUE;
|
MaximumTeamMembers = Integer.MAX_VALUE;
|
||||||
SpectateSystem = true;
|
SpectateSystem = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
String blueLeader = System.getProperty("blueLeader", null);
|
String blueLeader = System.getProperty("blueLeader", null);
|
||||||
@ -384,6 +384,6 @@ public class Config {
|
|||||||
return ArenaMode.Test.contains(mode);
|
return ArenaMode.Test.contains(mode);
|
||||||
}
|
}
|
||||||
public static boolean recording(){
|
public static boolean recording(){
|
||||||
return true;//mode == ArenaMode.EVENT;
|
return mode == ArenaMode.EVENT;
|
||||||
Chaoscaot markierte diese Unterhaltung als gelöst
Veraltet
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -19,6 +19,12 @@
|
|||||||
|
|
||||||
package de.steamwar.fightsystem.listener;
|
package de.steamwar.fightsystem.listener;
|
||||||
|
|
||||||
|
import com.comphenix.protocol.PacketType;
|
||||||
|
import com.comphenix.protocol.ProtocolLibrary;
|
||||||
|
import com.comphenix.protocol.events.PacketAdapter;
|
||||||
|
import com.comphenix.protocol.events.PacketContainer;
|
||||||
|
import com.comphenix.protocol.events.PacketEvent;
|
||||||
|
import com.comphenix.protocol.wrappers.EnumWrappers;
|
||||||
import de.steamwar.fightsystem.Config;
|
import de.steamwar.fightsystem.Config;
|
||||||
import de.steamwar.fightsystem.FightSystem;
|
import de.steamwar.fightsystem.FightSystem;
|
||||||
import de.steamwar.fightsystem.fight.Fight;
|
import de.steamwar.fightsystem.fight.Fight;
|
||||||
@ -28,6 +34,7 @@ import de.steamwar.fightsystem.record.RecordSystem;
|
|||||||
import de.steamwar.fightsystem.states.FightState;
|
import de.steamwar.fightsystem.states.FightState;
|
||||||
import de.steamwar.fightsystem.states.StateDependent;
|
import de.steamwar.fightsystem.states.StateDependent;
|
||||||
import de.steamwar.fightsystem.states.StateDependentListener;
|
import de.steamwar.fightsystem.states.StateDependentListener;
|
||||||
|
import net.minecraft.server.v1_15_R1.PacketPlayInBlockDig;
|
||||||
import org.bukkit.*;
|
import org.bukkit.*;
|
||||||
import org.bukkit.entity.EntityType;
|
import org.bukkit.entity.EntityType;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
@ -35,6 +42,7 @@ import org.bukkit.entity.TNTPrimed;
|
|||||||
import org.bukkit.event.EventHandler;
|
import org.bukkit.event.EventHandler;
|
||||||
import org.bukkit.event.EventPriority;
|
import org.bukkit.event.EventPriority;
|
||||||
import org.bukkit.event.Listener;
|
import org.bukkit.event.Listener;
|
||||||
|
import org.bukkit.event.block.Action;
|
||||||
import org.bukkit.event.block.BlockPhysicsEvent;
|
import org.bukkit.event.block.BlockPhysicsEvent;
|
||||||
import org.bukkit.event.entity.*;
|
import org.bukkit.event.entity.*;
|
||||||
import org.bukkit.event.inventory.InventoryClickEvent;
|
import org.bukkit.event.inventory.InventoryClickEvent;
|
||||||
@ -68,6 +76,35 @@ public class Recording implements Listener {
|
|||||||
despawnTNT();
|
despawnTNT();
|
||||||
}
|
}
|
||||||
}.register();
|
}.register();
|
||||||
|
|
||||||
Chaoscaot markierte diese Unterhaltung als gelöst
Veraltet
Lixfel
hat
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. 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.
|
|||||||
|
//Bow Listener
|
||||||
|
ProtocolLibrary.getProtocolManager().addPacketListener(new PacketAdapter(FightSystem.getPlugin(), PacketType.Play.Client.BLOCK_PLACE) {
|
||||||
|
@Override
|
||||||
|
public void onPacketReceiving(PacketEvent event) {
|
||||||
|
PacketContainer packet = event.getPacket();
|
||||||
|
EnumWrappers.Hand hand = packet.getHands().read(0);
|
||||||
|
Player p = event.getPlayer();
|
||||||
|
|
||||||
Chaoscaot markierte diese Unterhaltung als gelöst
Veraltet
Lixfel
hat
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ß. 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ß.
|
|||||||
|
if(!((hand == EnumWrappers.Hand.MAIN_HAND && p.getInventory().getItemInMainHand().getType() == Material.BOW) ||
|
||||||
|
(hand == EnumWrappers.Hand.OFF_HAND && p.getInventory().getItemInOffHand().getType() == Material.BOW)))
|
||||||
|
return;
|
||||||
Chaoscaot markierte diese Unterhaltung als gelöst
Veraltet
Lixfel
hat
Bögen können immer nur in der MainHand gespannt werden. Bögen können immer nur in der MainHand gespannt werden.
|
|||||||
|
|
||||||
|
RecordSystem.bowSpan(p, true, hand == EnumWrappers.Hand.MAIN_HAND?1:0);
|
||||||
|
ProtocolLibrary.getProtocolManager().addPacketListener(new PacketAdapter(FightSystem.getPlugin(), PacketType.Play.Client.BLOCK_DIG) {
|
||||||
|
@Override
|
||||||
|
public void onPacketReceiving(PacketEvent e) {
|
||||||
|
if(e.getPlayer() != event.getPlayer())
|
||||||
|
return;
|
||||||
|
|
||||||
|
PacketContainer packetDig = e.getPacket();
|
||||||
|
if(packetDig.getPlayerDigTypes().read(0) == EnumWrappers.PlayerDigType.RELEASE_USE_ITEM) {
|
||||||
|
RecordSystem.bowSpan(e.getPlayer(), false, hand == EnumWrappers.Hand.MAIN_HAND?0:1);
|
||||||
|
ProtocolLibrary.getProtocolManager().removePacketListener(this);
|
||||||
|
}
|
||||||
|
}
|
||||||
Chaoscaot markierte diese Unterhaltung als gelöst
Veraltet
YoyoNow
hat
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? 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?
|
|||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
|
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
|
||||||
@ -110,6 +147,9 @@ public class Recording implements Listener {
|
|||||||
|
|
||||||
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
|
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
|
||||||
Chaoscaot markierte diese Unterhaltung als gelöst
Veraltet
Lixfel
hat
Bitte das ganze erst nach den Prüfungen senden, wenn klar ist, dass dieser Spieler/Entity überhaupt gesendet wird! Bitte das ganze erst nach den Prüfungen senden, wenn klar ist, dass dieser Spieler/Entity überhaupt gesendet wird!
|
|||||||
public void onEntityDamage(EntityDamageEvent e) {
|
public void onEntityDamage(EntityDamageEvent e) {
|
||||||
Chaoscaot markierte diese Unterhaltung als gelöst
Veraltet
YoyoNow
hat
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? 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?
Chaoscaot
hat
Das ist nicht gelöcht, dass ist eine Flag, die angibt ob das Feuer Permanent oder für 21 Ticks ist. Das ist nicht gelöcht, dass ist eine Flag, die angibt ob das Feuer Permanent oder für 21 Ticks ist.
|
|||||||
|
if(e.getCause() == EntityDamageEvent.DamageCause.FIRE_TICK || e.getCause() == EntityDamageEvent.DamageCause.FIRE ||e.getEntity().getFireTicks() > 0)
|
||||||
|
RecordSystem.setOnFire(e.getEntity(), false);
|
||||||
|
|
||||||
if(e.getEntityType() != EntityType.PLAYER)
|
if(e.getEntityType() != EntityType.PLAYER)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@ -118,9 +158,6 @@ public class Recording implements Listener {
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
RecordSystem.damageAnimation(p);
|
RecordSystem.damageAnimation(p);
|
||||||
|
|
||||||
if(e.getCause() == EntityDamageEvent.DamageCause.FIRE_TICK)
|
|
||||||
RecordSystem.setOnFire(p);
|
|
||||||
}
|
}
|
||||||
Chaoscaot markierte diese Unterhaltung als gelöst
Veraltet
YoyoNow
hat
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! 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!
|
|||||||
|
|
||||||
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
|
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
|
||||||
|
@ -64,9 +64,9 @@ public class RecordSystem {
|
|||||||
* PlayerItemPacket (0x07) + int EntityId + String item + boolean enchanted + String slot
|
* PlayerItemPacket (0x07) + int EntityId + String item + boolean enchanted + String slot
|
||||||
* ArrowSpawnPacket (0x08) + int EntityId
|
* ArrowSpawnPacket (0x08) + int EntityId
|
||||||
* FireballSpawnPacket (0x09) + int EntityId
|
* FireballSpawnPacket (0x09) + int EntityId
|
||||||
* BowSpanPacket (0x0A) + int EntityId + boolean hand
|
* BowSpanPacket (0x0A) + int EntityId + boolean start + int hand
|
||||||
* PlayerDamagePacket (0x0B) + int EntityId
|
* PlayerDamagePacket (0x0B) + int EntityId
|
||||||
* SetOnFire (0x0C) + int EntityId
|
* SetOnFire (0x0C) + int EntityId + boolean perma
|
||||||
Lixfel markierte diese Unterhaltung als gelöst
YoyoNow
hat
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. 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.
Chaoscaot
hat
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. 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.
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* BlockPacket (0x30) + pos int, byte, int + int BlockState
|
* BlockPacket (0x30) + pos int, byte, int + int BlockState
|
||||||
@ -166,6 +166,8 @@ public class RecordSystem {
|
|||||||
public static synchronized void arrowSpawn(Entity e){
|
public static synchronized void arrowSpawn(Entity e){
|
||||||
Recorder.rByte(0x08);
|
Recorder.rByte(0x08);
|
||||||
spawnEntity(e);
|
spawnEntity(e);
|
||||||
|
if(e.getFireTicks() > 0)
|
||||||
|
setOnFire(e, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static synchronized void fireballSpawn(Entity e){
|
public static synchronized void fireballSpawn(Entity e){
|
||||||
@ -173,9 +175,11 @@ public class RecordSystem {
|
|||||||
spawnEntity(e);
|
spawnEntity(e);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static synchronized void bowSpan(Player p) {
|
public static synchronized void bowSpan(Entity e, boolean start, int hand) {
|
||||||
Lixfel markierte diese Unterhaltung als gelöst
Veraltet
YoyoNow
hat
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? 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?
Chaoscaot
hat
Die "Stadien" die das Bogen Spannen hat werden Client Seitig berechnet. Die "Stadien" die das Bogen Spannen hat werden Client Seitig berechnet.
Lixfel
hat
Bögen kann man nur in der MainHand spannen? (Meines wissens nach?) Bögen kann man nur in der MainHand spannen? (Meines wissens nach?)
|
|||||||
Recorder.rByte(0x0A);
|
Recorder.rByte(0x0A);
|
||||||
Recorder.rInt(p.getEntityId());
|
Recorder.rInt(e.getEntityId());
|
||||||
|
Recorder.rBoolean(start);
|
||||||
|
Recorder.rInt(hand);
|
||||||
Recorder.flush();
|
Recorder.flush();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -185,9 +189,10 @@ public class RecordSystem {
|
|||||||
Recorder.flush();
|
Recorder.flush();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static synchronized void setOnFire(Player p) {
|
public static synchronized void setOnFire(Entity e, boolean perma) {
|
||||||
Chaoscaot markierte diese Unterhaltung als gelöst
Lixfel
hat
Gibt es überhaupt permafeuer, wenn ja, wo? Gibt es überhaupt permafeuer, wenn ja, wo?
|
|||||||
Recorder.rByte(0x0C);
|
Recorder.rByte(0x0C);
|
||||||
Recorder.rInt(p.getEntityId());
|
Recorder.rInt(e.getEntityId());
|
||||||
|
Recorder.rBoolean(perma);
|
||||||
Recorder.flush();
|
Recorder.flush();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Nope!