Commit b39e6bf1 by Jonathan Thomas

Adding DamageTracker class, to keep track of "recent" damage to players (the…

Adding DamageTracker class, to keep track of "recent" damage to players (the type and source). This will be needed in our Protect Goal soon.
parent 05c312a8
Pipeline #12558 passed with stages
in 2 minutes 0 seconds
package com.owlmaddie.damage;
import net.minecraft.entity.damage.DamageSource;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.UUID;
/**
* The {@code DamageTracker} class is used to track recent damage to players (type and source of damage).
*/
public class DamageTracker {
public static final Logger LOGGER = LoggerFactory.getLogger("creaturechat");
private final Map<UUID, DamageInfo> damageMap = new HashMap<>();
private final int ticksToTrack;
public DamageTracker(int ticksToTrack) {
this.ticksToTrack = ticksToTrack;
}
public synchronized void recordDamage(UUID playerUuid, DamageSource damageSource) {
DamageInfo damageInfo = new DamageInfo(damageSource, ticksToTrack);
damageMap.put(playerUuid, damageInfo);
LOGGER.info("Damage recorded to player");
}
public synchronized DamageInfo getDamageInfo(UUID playerUuid) {
return damageMap.get(playerUuid);
}
public synchronized void tick() {
Iterator<Map.Entry<UUID, DamageInfo>> iterator = damageMap.entrySet().iterator();
while (iterator.hasNext()) {
Map.Entry<UUID, DamageInfo> entry = iterator.next();
DamageInfo damageInfo = entry.getValue();
damageInfo.decrementTicks();
if (damageInfo.getTicksLeft() <= 0) {
LOGGER.info("Damage cleared from player");
iterator.remove();
}
}
}
public static class DamageInfo {
private final DamageSource damageSource;
private int ticksLeft;
public DamageInfo(DamageSource damageSource, int ticksLeft) {
this.damageSource = damageSource;
this.ticksLeft = ticksLeft;
}
public DamageSource getDamageSource() {
return damageSource;
}
public int getTicksLeft() {
return ticksLeft;
}
public void decrementTicks() {
this.ticksLeft--;
}
public void resetTicks(int ticksLeft) {
this.ticksLeft = ticksLeft;
}
}
}
......@@ -63,6 +63,13 @@ public class MixinLivingEntity implements LivingEntityInterface {
ServerPackets.generate_chat("N/A", chatData, player, (MobEntity)thisEntity, attackedMessage, true);
}
}
// Handle Entity -> Player damage
if (thisEntity instanceof ServerPlayerEntity && attacker instanceof LivingEntity && !thisEntity.isDead()) {
// Record the damage
ServerPlayerEntity player = (ServerPlayerEntity) thisEntity;
ServerPackets.damageTracker.recordDamage(player.getUuid(), source);
}
}
@Inject(method = "onDeath", at = @At("HEAD"))
......
......@@ -2,6 +2,7 @@ package com.owlmaddie.network;
import com.owlmaddie.chat.ChatDataManager;
import com.owlmaddie.chat.ChatDataSaverScheduler;
import com.owlmaddie.damage.DamageTracker;
import com.owlmaddie.goals.EntityBehaviorManager;
import com.owlmaddie.goals.GoalPriority;
import com.owlmaddie.goals.TalkPlayerGoal;
......@@ -11,6 +12,7 @@ import com.owlmaddie.utils.Randomizer;
import com.owlmaddie.utils.ServerEntityFinder;
import io.netty.buffer.Unpooled;
import net.fabricmc.fabric.api.event.lifecycle.v1.ServerEntityEvents;
import net.fabricmc.fabric.api.event.lifecycle.v1.ServerTickEvents;
import net.fabricmc.fabric.api.event.lifecycle.v1.ServerWorldEvents;
import net.fabricmc.fabric.api.networking.v1.ServerPlayConnectionEvents;
import net.fabricmc.fabric.api.networking.v1.ServerPlayNetworking;
......@@ -39,6 +41,7 @@ import java.util.concurrent.TimeUnit;
*/
public class ServerPackets {
public static final Logger LOGGER = LoggerFactory.getLogger("creaturechat");
public static final DamageTracker damageTracker = new DamageTracker(100);
public static MinecraftServer serverInstance;
private static ChatDataSaverScheduler scheduler = null;
public static final Identifier PACKET_C2S_GREETING = new Identifier("creaturechat", "packet_c2s_greeting");
......@@ -51,7 +54,15 @@ public class ServerPackets {
public static final Identifier PACKET_S2C_LOGIN = new Identifier("creaturechat", "packet_s2c_login");
public static final Identifier PACKET_S2C_PLAYER_STATUS = new Identifier("creaturechat", "packet_s2c_player_status");
private static void onServerTick(MinecraftServer server) {
// Update our damage tracker on each tick (used to track damage to players)
damageTracker.tick();
}
public static void register() {
// Register damage tracker
ServerTickEvents.END_SERVER_TICK.register(ServerPackets::onServerTick);
// Handle packet for Greeting
ServerPlayNetworking.registerGlobalReceiver(PACKET_C2S_GREETING, (server, player, handler, buf, responseSender) -> {
UUID entityId = UUID.fromString(buf.readString());
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment