移除火炮的主人(

This commit is contained in:
Atsuishio 2025-07-09 22:10:39 +08:00 committed by Light_Quanta
parent f876137e17
commit 8c7169a01a
No known key found for this signature in database
GPG key ID: 11A39A1B8C890959
3 changed files with 12 additions and 136 deletions

View file

@ -31,7 +31,6 @@ import net.minecraft.network.syncher.SynchedEntityData;
import net.minecraft.resources.ResourceLocation; import net.minecraft.resources.ResourceLocation;
import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerLevel;
import net.minecraft.server.level.ServerPlayer; import net.minecraft.server.level.ServerPlayer;
import net.minecraft.server.players.OldUsersConverter;
import net.minecraft.sounds.SoundEvents; import net.minecraft.sounds.SoundEvents;
import net.minecraft.sounds.SoundSource; import net.minecraft.sounds.SoundSource;
import net.minecraft.util.Mth; import net.minecraft.util.Mth;
@ -41,7 +40,6 @@ import net.minecraft.world.InteractionResult;
import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.EntityType;
import net.minecraft.world.entity.MoverType; import net.minecraft.world.entity.MoverType;
import net.minecraft.world.entity.OwnableEntity;
import net.minecraft.world.entity.player.Player; import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.Explosion; import net.minecraft.world.level.Explosion;
@ -61,18 +59,14 @@ import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache;
import software.bernie.geckolib.animation.*; import software.bernie.geckolib.animation.*;
import software.bernie.geckolib.util.GeckoLibUtil; import software.bernie.geckolib.util.GeckoLibUtil;
import java.util.Optional;
import java.util.UUID;
import static com.atsuishio.superbwarfare.tools.RangeTool.calculateLaunchVector; import static com.atsuishio.superbwarfare.tools.RangeTool.calculateLaunchVector;
public class Mk42Entity extends VehicleEntity implements GeoEntity, CannonEntity, Container, OwnableEntity { public class Mk42Entity extends VehicleEntity implements GeoEntity, CannonEntity, Container {
public static final EntityDataAccessor<Integer> COOL_DOWN = SynchedEntityData.defineId(Mk42Entity.class, EntityDataSerializers.INT); public static final EntityDataAccessor<Integer> COOL_DOWN = SynchedEntityData.defineId(Mk42Entity.class, EntityDataSerializers.INT);
private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this);
public static final EntityDataAccessor<Float> PITCH = SynchedEntityData.defineId(Mk42Entity.class, EntityDataSerializers.FLOAT); public static final EntityDataAccessor<Float> PITCH = SynchedEntityData.defineId(Mk42Entity.class, EntityDataSerializers.FLOAT);
public static final EntityDataAccessor<Float> YAW = SynchedEntityData.defineId(Mk42Entity.class, EntityDataSerializers.FLOAT); public static final EntityDataAccessor<Float> YAW = SynchedEntityData.defineId(Mk42Entity.class, EntityDataSerializers.FLOAT);
public static final EntityDataAccessor<Optional<UUID>> OWNER_UUID = SynchedEntityData.defineId(Mk42Entity.class, EntityDataSerializers.OPTIONAL_UUID);
private final float shellGravity = 0.1f; private final float shellGravity = 0.1f;
@ -88,8 +82,7 @@ public class Mk42Entity extends VehicleEntity implements GeoEntity, CannonEntity
super.defineSynchedData(builder); super.defineSynchedData(builder);
builder.define(COOL_DOWN, 0) builder.define(COOL_DOWN, 0)
.define(PITCH, 0F) .define(PITCH, 0F)
.define(YAW, 0F) .define(YAW, 0F);
.define(OWNER_UUID, Optional.empty());
} }
@Override @Override
@ -129,9 +122,6 @@ public class Mk42Entity extends VehicleEntity implements GeoEntity, CannonEntity
compound.putInt("CoolDown", this.entityData.get(COOL_DOWN)); compound.putInt("CoolDown", this.entityData.get(COOL_DOWN));
compound.putFloat("Pitch", this.entityData.get(PITCH)); compound.putFloat("Pitch", this.entityData.get(PITCH));
compound.putFloat("Yaw", this.entityData.get(YAW)); compound.putFloat("Yaw", this.entityData.get(YAW));
if (this.getOwnerUUID() != null) {
compound.putUUID("Owner", this.getOwnerUUID());
}
} }
@Override @Override
@ -140,47 +130,14 @@ public class Mk42Entity extends VehicleEntity implements GeoEntity, CannonEntity
this.entityData.set(COOL_DOWN, compound.getInt("CoolDown")); this.entityData.set(COOL_DOWN, compound.getInt("CoolDown"));
this.entityData.set(PITCH, compound.getFloat("Pitch")); this.entityData.set(PITCH, compound.getFloat("Pitch"));
this.entityData.set(YAW, compound.getFloat("Yaw")); this.entityData.set(YAW, compound.getFloat("Yaw"));
UUID uuid;
if (compound.hasUUID("Owner")) {
uuid = compound.getUUID("Owner");
} else {
String s = compound.getString("Owner");
assert this.getServer() != null;
uuid = OldUsersConverter.convertMobOwnerIfNecessary(this.getServer(), s);
} }
if (uuid != null) {
try {
this.setOwnerUUID(uuid);
} catch (Throwable ignored) {
}
}
}
public void setOwnerUUID(@Nullable UUID pUuid) {
this.entityData.set(OWNER_UUID, Optional.ofNullable(pUuid));
}
@Nullable
public UUID getOwnerUUID() {
return this.entityData.get(OWNER_UUID).orElse(null);
}
@Override @Override
public @NotNull InteractionResult interact(Player player, @NotNull InteractionHand hand) { public @NotNull InteractionResult interact(Player player, @NotNull InteractionHand hand) {
ItemStack stack = player.getMainHandItem(); ItemStack stack = player.getMainHandItem();
if (player.isShiftKeyDown() && this.getOwner() == null) {
setOwnerUUID(player.getUUID());
if (player instanceof ServerPlayer serverPlayer) {
serverPlayer.level().playSound(null, serverPlayer.getOnPos(), SoundEvents.ARROW_HIT_PLAYER, SoundSource.PLAYERS, 0.5F, 1);
}
return InteractionResult.SUCCESS;
}
if (stack.getItem() instanceof ArtilleryIndicator indicator && player == getOwner() && this.getOwner() == player) { if (stack.getItem() instanceof ArtilleryIndicator indicator) {
if (indicator.addCannon(stack, getStringUUID())) { if (indicator.addCannon(stack, getStringUUID())) {
if (player instanceof ServerPlayer serverPlayer) { if (player instanceof ServerPlayer serverPlayer) {
serverPlayer.level().playSound(null, serverPlayer.getOnPos(), SoundEvents.ARROW_HIT_PLAYER, SoundSource.PLAYERS, 0.5F, 1); serverPlayer.level().playSound(null, serverPlayer.getOnPos(), SoundEvents.ARROW_HIT_PLAYER, SoundSource.PLAYERS, 0.5F, 1);
@ -403,7 +360,7 @@ public class Mk42Entity extends VehicleEntity implements GeoEntity, CannonEntity
InventoryTool.consumeItem(player.getInventory().items, ammo, 1); InventoryTool.consumeItem(player.getInventory().items, ammo, 1);
} }
if (getFirstPassenger() != getOwner()) { if (getFirstPassenger() != player) {
this.stack = ItemStack.EMPTY; this.stack = ItemStack.EMPTY;
} }

View file

@ -31,7 +31,6 @@ import net.minecraft.network.syncher.SynchedEntityData;
import net.minecraft.resources.ResourceLocation; import net.minecraft.resources.ResourceLocation;
import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerLevel;
import net.minecraft.server.level.ServerPlayer; import net.minecraft.server.level.ServerPlayer;
import net.minecraft.server.players.OldUsersConverter;
import net.minecraft.sounds.SoundEvents; import net.minecraft.sounds.SoundEvents;
import net.minecraft.sounds.SoundSource; import net.minecraft.sounds.SoundSource;
import net.minecraft.util.Mth; import net.minecraft.util.Mth;
@ -41,7 +40,6 @@ import net.minecraft.world.InteractionResult;
import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.EntityType;
import net.minecraft.world.entity.MoverType; import net.minecraft.world.entity.MoverType;
import net.minecraft.world.entity.OwnableEntity;
import net.minecraft.world.entity.player.Player; import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.Explosion; import net.minecraft.world.level.Explosion;
@ -61,12 +59,9 @@ import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache;
import software.bernie.geckolib.animation.*; import software.bernie.geckolib.animation.*;
import software.bernie.geckolib.util.GeckoLibUtil; import software.bernie.geckolib.util.GeckoLibUtil;
import java.util.Optional;
import java.util.UUID;
import static com.atsuishio.superbwarfare.tools.RangeTool.calculateLaunchVector; import static com.atsuishio.superbwarfare.tools.RangeTool.calculateLaunchVector;
public class Mle1934Entity extends VehicleEntity implements GeoEntity, CannonEntity, Container, OwnableEntity { public class Mle1934Entity extends VehicleEntity implements GeoEntity, CannonEntity, Container {
public static final EntityDataAccessor<Integer> COOL_DOWN = SynchedEntityData.defineId(Mle1934Entity.class, EntityDataSerializers.INT); public static final EntityDataAccessor<Integer> COOL_DOWN = SynchedEntityData.defineId(Mle1934Entity.class, EntityDataSerializers.INT);
public static final EntityDataAccessor<Integer> TYPE = SynchedEntityData.defineId(Mle1934Entity.class, EntityDataSerializers.INT); public static final EntityDataAccessor<Integer> TYPE = SynchedEntityData.defineId(Mle1934Entity.class, EntityDataSerializers.INT);
@ -74,8 +69,6 @@ public class Mle1934Entity extends VehicleEntity implements GeoEntity, CannonEnt
public static final EntityDataAccessor<Float> YAW = SynchedEntityData.defineId(Mle1934Entity.class, EntityDataSerializers.FLOAT); public static final EntityDataAccessor<Float> YAW = SynchedEntityData.defineId(Mle1934Entity.class, EntityDataSerializers.FLOAT);
private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this);
public static final EntityDataAccessor<Optional<UUID>> OWNER_UUID = SynchedEntityData.defineId(Mle1934Entity.class, EntityDataSerializers.OPTIONAL_UUID);
private final float shellGravity = 0.1f; private final float shellGravity = 0.1f;
public Mle1934Entity(EntityType<Mle1934Entity> type, Level world) { public Mle1934Entity(EntityType<Mle1934Entity> type, Level world) {
@ -122,8 +115,7 @@ public class Mle1934Entity extends VehicleEntity implements GeoEntity, CannonEnt
builder.define(COOL_DOWN, 0) builder.define(COOL_DOWN, 0)
.define(TYPE, 0) .define(TYPE, 0)
.define(PITCH, 0f) .define(PITCH, 0f)
.define(YAW, 0f) .define(YAW, 0f);
.define(OWNER_UUID, Optional.empty());
} }
@Override @Override
@ -133,9 +125,6 @@ public class Mle1934Entity extends VehicleEntity implements GeoEntity, CannonEnt
compound.putInt("Type", this.entityData.get(TYPE)); compound.putInt("Type", this.entityData.get(TYPE));
compound.putFloat("Pitch", this.entityData.get(PITCH)); compound.putFloat("Pitch", this.entityData.get(PITCH));
compound.putFloat("Yaw", this.entityData.get(YAW)); compound.putFloat("Yaw", this.entityData.get(YAW));
if (this.getOwnerUUID() != null) {
compound.putUUID("Owner", this.getOwnerUUID());
}
} }
@Override @Override
@ -145,47 +134,13 @@ public class Mle1934Entity extends VehicleEntity implements GeoEntity, CannonEnt
this.entityData.set(TYPE, compound.getInt("Type")); this.entityData.set(TYPE, compound.getInt("Type"));
this.entityData.set(PITCH, compound.getFloat("Pitch")); this.entityData.set(PITCH, compound.getFloat("Pitch"));
this.entityData.set(YAW, compound.getFloat("Yaw")); this.entityData.set(YAW, compound.getFloat("Yaw"));
UUID uuid;
if (compound.hasUUID("Owner")) {
uuid = compound.getUUID("Owner");
} else {
String s = compound.getString("Owner");
assert this.getServer() != null;
uuid = OldUsersConverter.convertMobOwnerIfNecessary(this.getServer(), s);
} }
if (uuid != null) {
try {
this.setOwnerUUID(uuid);
} catch (Throwable ignored) {
}
}
}
public void setOwnerUUID(@Nullable UUID pUuid) {
this.entityData.set(OWNER_UUID, Optional.ofNullable(pUuid));
}
@Nullable
public UUID getOwnerUUID() {
return this.entityData.get(OWNER_UUID).orElse(null);
}
@Override @Override
public @NotNull InteractionResult interact(Player player, @NotNull InteractionHand hand) { public @NotNull InteractionResult interact(Player player, @NotNull InteractionHand hand) {
ItemStack stack = player.getMainHandItem(); ItemStack stack = player.getMainHandItem();
if (player.isShiftKeyDown() && this.getOwner() == null) { if (stack.getItem() instanceof ArtilleryIndicator indicator) {
setOwnerUUID(player.getUUID());
if (player instanceof ServerPlayer serverPlayer) {
serverPlayer.level().playSound(null, serverPlayer.getOnPos(), SoundEvents.ARROW_HIT_PLAYER, SoundSource.PLAYERS, 0.5F, 1);
}
return InteractionResult.SUCCESS;
}
if (stack.getItem() instanceof ArtilleryIndicator indicator && player == getOwner() && this.getOwner() == player) {
if (indicator.addCannon(stack, getStringUUID())) { if (indicator.addCannon(stack, getStringUUID())) {
if (player instanceof ServerPlayer serverPlayer) { if (player instanceof ServerPlayer serverPlayer) {
serverPlayer.level().playSound(null, serverPlayer.getOnPos(), SoundEvents.ARROW_HIT_PLAYER, SoundSource.PLAYERS, 0.5F, 1); serverPlayer.level().playSound(null, serverPlayer.getOnPos(), SoundEvents.ARROW_HIT_PLAYER, SoundSource.PLAYERS, 0.5F, 1);
@ -422,7 +377,7 @@ public class Mle1934Entity extends VehicleEntity implements GeoEntity, CannonEnt
consumed = stack.getCount(); consumed = stack.getCount();
} }
if (getFirstPassenger() != getOwner()) { if (getFirstPassenger() != player) {
this.stack = ItemStack.EMPTY; this.stack = ItemStack.EMPTY;
} }

View file

@ -19,7 +19,6 @@ import net.minecraft.network.syncher.EntityDataSerializers;
import net.minecraft.network.syncher.SynchedEntityData; import net.minecraft.network.syncher.SynchedEntityData;
import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerLevel;
import net.minecraft.server.level.ServerPlayer; import net.minecraft.server.level.ServerPlayer;
import net.minecraft.server.players.OldUsersConverter;
import net.minecraft.sounds.SoundEvents; import net.minecraft.sounds.SoundEvents;
import net.minecraft.sounds.SoundSource; import net.minecraft.sounds.SoundSource;
import net.minecraft.util.Mth; import net.minecraft.util.Mth;
@ -29,7 +28,6 @@ import net.minecraft.world.InteractionResult;
import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.EntityType;
import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.LivingEntity;
import net.minecraft.world.entity.MoverType; import net.minecraft.world.entity.MoverType;
import net.minecraft.world.entity.OwnableEntity;
import net.minecraft.world.entity.item.ItemEntity; import net.minecraft.world.entity.item.ItemEntity;
import net.minecraft.world.entity.player.Player; import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.ItemStack;
@ -44,18 +42,14 @@ import software.bernie.geckolib.animatable.instance.AnimatableInstanceCache;
import software.bernie.geckolib.animation.*; import software.bernie.geckolib.animation.*;
import software.bernie.geckolib.util.GeckoLibUtil; import software.bernie.geckolib.util.GeckoLibUtil;
import java.util.Optional;
import java.util.UUID;
import static com.atsuishio.superbwarfare.tools.RangeTool.calculateLaunchVector; import static com.atsuishio.superbwarfare.tools.RangeTool.calculateLaunchVector;
public class MortarEntity extends VehicleEntity implements GeoEntity, Container, OwnableEntity { public class MortarEntity extends VehicleEntity implements GeoEntity, Container {
public static final EntityDataAccessor<Integer> FIRE_TIME = SynchedEntityData.defineId(MortarEntity.class, EntityDataSerializers.INT); public static final EntityDataAccessor<Integer> FIRE_TIME = SynchedEntityData.defineId(MortarEntity.class, EntityDataSerializers.INT);
public static final EntityDataAccessor<Float> PITCH = SynchedEntityData.defineId(MortarEntity.class, EntityDataSerializers.FLOAT); public static final EntityDataAccessor<Float> PITCH = SynchedEntityData.defineId(MortarEntity.class, EntityDataSerializers.FLOAT);
public static final EntityDataAccessor<Float> YAW = SynchedEntityData.defineId(MortarEntity.class, EntityDataSerializers.FLOAT); public static final EntityDataAccessor<Float> YAW = SynchedEntityData.defineId(MortarEntity.class, EntityDataSerializers.FLOAT);
public static final EntityDataAccessor<Boolean> INTELLIGENT = SynchedEntityData.defineId(MortarEntity.class, EntityDataSerializers.BOOLEAN); public static final EntityDataAccessor<Boolean> INTELLIGENT = SynchedEntityData.defineId(MortarEntity.class, EntityDataSerializers.BOOLEAN);
public static final EntityDataAccessor<Optional<UUID>> OWNER_UUID = SynchedEntityData.defineId(MortarEntity.class, EntityDataSerializers.OPTIONAL_UUID);
private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this);
@ -83,8 +77,7 @@ public class MortarEntity extends VehicleEntity implements GeoEntity, Container,
builder.define(FIRE_TIME, 0) builder.define(FIRE_TIME, 0)
.define(PITCH, -70f) .define(PITCH, -70f)
.define(YAW, this.getYRot()) .define(YAW, this.getYRot())
.define(INTELLIGENT, false) .define(INTELLIGENT, false);
.define(OWNER_UUID, Optional.empty());
} }
@Override @Override
@ -98,9 +91,6 @@ public class MortarEntity extends VehicleEntity implements GeoEntity, Container,
compound.putFloat("Pitch", this.entityData.get(PITCH)); compound.putFloat("Pitch", this.entityData.get(PITCH));
compound.putFloat("Yaw", this.entityData.get(YAW)); compound.putFloat("Yaw", this.entityData.get(YAW));
compound.putBoolean("Intelligent", this.entityData.get(INTELLIGENT)); compound.putBoolean("Intelligent", this.entityData.get(INTELLIGENT));
if (this.getOwnerUUID() != null) {
compound.putUUID("Owner", this.getOwnerUUID());
}
} }
@Override @Override
@ -115,31 +105,6 @@ public class MortarEntity extends VehicleEntity implements GeoEntity, Container,
if (compound.contains("Intelligent")) { if (compound.contains("Intelligent")) {
this.entityData.set(INTELLIGENT, compound.getBoolean("Intelligent")); this.entityData.set(INTELLIGENT, compound.getBoolean("Intelligent"));
} }
UUID uuid;
if (compound.hasUUID("Owner")) {
uuid = compound.getUUID("Owner");
} else {
String s = compound.getString("Owner");
assert this.getServer() != null;
uuid = OldUsersConverter.convertMobOwnerIfNecessary(this.getServer(), s);
}
if (uuid != null) {
try {
this.setOwnerUUID(uuid);
} catch (Throwable ignored) {
}
}
}
public void setOwnerUUID(@Nullable UUID pUuid) {
this.entityData.set(OWNER_UUID, Optional.ofNullable(pUuid));
}
@Nullable
public UUID getOwnerUUID() {
return this.entityData.get(OWNER_UUID).orElse(null);
} }
public void fire(@Nullable LivingEntity shooter) { public void fire(@Nullable LivingEntity shooter) {
@ -159,7 +124,7 @@ public class MortarEntity extends VehicleEntity implements GeoEntity, Container,
public @NotNull InteractionResult interact(Player player, @NotNull InteractionHand hand) { public @NotNull InteractionResult interact(Player player, @NotNull InteractionHand hand) {
ItemStack mainHandItem = player.getMainHandItem(); ItemStack mainHandItem = player.getMainHandItem();
if (mainHandItem.getItem() instanceof ArtilleryIndicator indicator && player == getOwner() && this.entityData.get(INTELLIGENT)) { if (mainHandItem.getItem() instanceof ArtilleryIndicator indicator && this.entityData.get(INTELLIGENT)) {
if (indicator.addCannon(mainHandItem, getStringUUID())) { if (indicator.addCannon(mainHandItem, getStringUUID())) {
if (player instanceof ServerPlayer serverPlayer) { if (player instanceof ServerPlayer serverPlayer) {
serverPlayer.level().playSound(null, serverPlayer.getOnPos(), SoundEvents.ARROW_HIT_PLAYER, SoundSource.PLAYERS, 0.5F, 1); serverPlayer.level().playSound(null, serverPlayer.getOnPos(), SoundEvents.ARROW_HIT_PLAYER, SoundSource.PLAYERS, 0.5F, 1);
@ -178,7 +143,6 @@ public class MortarEntity extends VehicleEntity implements GeoEntity, Container,
} }
if (mainHandItem.getItem() instanceof Monitor && player.isShiftKeyDown() && !this.entityData.get(INTELLIGENT)) { if (mainHandItem.getItem() instanceof Monitor && player.isShiftKeyDown() && !this.entityData.get(INTELLIGENT)) {
setOwnerUUID(player.getUUID());
entityData.set(INTELLIGENT, true); entityData.set(INTELLIGENT, true);
if (player instanceof ServerPlayer serverPlayer) { if (player instanceof ServerPlayer serverPlayer) {
serverPlayer.level().playSound(null, serverPlayer.getOnPos(), SoundEvents.ARROW_HIT_PLAYER, SoundSource.PLAYERS, 0.5F, 1); serverPlayer.level().playSound(null, serverPlayer.getOnPos(), SoundEvents.ARROW_HIT_PLAYER, SoundSource.PLAYERS, 0.5F, 1);
@ -281,7 +245,7 @@ public class MortarEntity extends VehicleEntity implements GeoEntity, Container,
if (level instanceof ServerLevel server) { if (level instanceof ServerLevel server) {
MortarShellEntity entityToSpawn = MortarShell.createShell(shooter, level, this.stack); MortarShellEntity entityToSpawn = MortarShell.createShell(shooter, level, this.stack);
entityToSpawn.setPos(this.getX(), this.getEyeY(), this.getZ()); entityToSpawn.setPos(this.getX(), this.getEyeY(), this.getZ());
entityToSpawn.shoot(this.getLookAngle().x, this.getLookAngle().y, this.getLookAngle().z, 13f, (float) 1); entityToSpawn.shoot(this.getLookAngle().x, this.getLookAngle().y, this.getLookAngle().z, 13f, (float) 0.4);
level.addFreshEntity(entityToSpawn); level.addFreshEntity(entityToSpawn);
server.sendParticles(ParticleTypes.CAMPFIRE_COSY_SMOKE, (this.getX() + 3 * this.getLookAngle().x), (this.getY() + 0.1 + 3 * this.getLookAngle().y), (this.getZ() + 3 * this.getLookAngle().z), 8, 0.4, 0.4, 0.4, server.sendParticles(ParticleTypes.CAMPFIRE_COSY_SMOKE, (this.getX() + 3 * this.getLookAngle().x), (this.getY() + 0.1 + 3 * this.getLookAngle().y), (this.getZ() + 3 * this.getLookAngle().z), 8, 0.4, 0.4, 0.4,
0.007); 0.007);