Strip all Phase references, TODO/FUTURE roadmap notes, and internal planning comments from the codebase. Run Prettier for consistent formatting across all Java files.
210 lines
5.4 KiB
Java
210 lines
5.4 KiB
Java
package com.tiedup.remake.bounty;
|
|
|
|
import java.util.UUID;
|
|
import net.minecraft.nbt.CompoundTag;
|
|
import net.minecraft.world.item.ItemStack;
|
|
|
|
/**
|
|
* Represents a single bounty placed on a player.
|
|
*
|
|
*
|
|
* A bounty is created when a player (client) offers a reward for capturing
|
|
* another player (target). Anyone who delivers the target to the client
|
|
* receives the reward.
|
|
*/
|
|
public class Bounty {
|
|
|
|
private final String id;
|
|
private final UUID clientId;
|
|
private final UUID targetId;
|
|
private String clientName;
|
|
private String targetName;
|
|
private final ItemStack reward;
|
|
private final long creationTime; // System.currentTimeMillis()
|
|
private final int durationSeconds; // How long the bounty lasts
|
|
|
|
/**
|
|
* Create a new bounty.
|
|
*/
|
|
public Bounty(
|
|
UUID clientId,
|
|
String clientName,
|
|
UUID targetId,
|
|
String targetName,
|
|
ItemStack reward,
|
|
int durationSeconds
|
|
) {
|
|
this.id = UUID.randomUUID().toString();
|
|
this.clientId = clientId;
|
|
this.clientName = clientName;
|
|
this.targetId = targetId;
|
|
this.targetName = targetName;
|
|
this.reward = reward.copy();
|
|
this.creationTime = System.currentTimeMillis();
|
|
this.durationSeconds = durationSeconds;
|
|
}
|
|
|
|
/**
|
|
* Create a bounty from NBT data.
|
|
*/
|
|
private Bounty(
|
|
String id,
|
|
UUID clientId,
|
|
String clientName,
|
|
UUID targetId,
|
|
String targetName,
|
|
ItemStack reward,
|
|
long creationTime,
|
|
int durationSeconds
|
|
) {
|
|
this.id = id;
|
|
this.clientId = clientId;
|
|
this.clientName = clientName;
|
|
this.targetId = targetId;
|
|
this.targetName = targetName;
|
|
this.reward = reward;
|
|
this.creationTime = creationTime;
|
|
this.durationSeconds = durationSeconds;
|
|
}
|
|
|
|
// ==================== GETTERS ====================
|
|
|
|
public String getId() {
|
|
return id;
|
|
}
|
|
|
|
public UUID getClientId() {
|
|
return clientId;
|
|
}
|
|
|
|
public UUID getTargetId() {
|
|
return targetId;
|
|
}
|
|
|
|
public String getClientName() {
|
|
return clientName;
|
|
}
|
|
|
|
public String getTargetName() {
|
|
return targetName;
|
|
}
|
|
|
|
public ItemStack getReward() {
|
|
return reward.copy();
|
|
}
|
|
|
|
public int getDurationSeconds() {
|
|
return durationSeconds;
|
|
}
|
|
|
|
public long getCreationTime() {
|
|
return creationTime;
|
|
}
|
|
|
|
// ==================== TIME CALCULATIONS ====================
|
|
|
|
/**
|
|
* Get remaining time in seconds.
|
|
*/
|
|
public int getSecondsRemaining() {
|
|
long elapsed = (System.currentTimeMillis() - creationTime) / 1000;
|
|
return Math.max(0, durationSeconds - (int) elapsed);
|
|
}
|
|
|
|
/**
|
|
* Get remaining time as [hours, minutes].
|
|
*/
|
|
public int[] getRemainingTime() {
|
|
int seconds = getSecondsRemaining();
|
|
int hours = seconds / 3600;
|
|
int minutes = (seconds % 3600) / 60;
|
|
return new int[] { hours, minutes };
|
|
}
|
|
|
|
/**
|
|
* Check if bounty has expired.
|
|
*/
|
|
public boolean isExpired() {
|
|
return getSecondsRemaining() <= 0;
|
|
}
|
|
|
|
// ==================== PLAYER CHECKS ====================
|
|
|
|
/**
|
|
* Check if player is the client (creator) of this bounty.
|
|
*/
|
|
public boolean isClient(UUID playerId) {
|
|
return clientId.equals(playerId);
|
|
}
|
|
|
|
/**
|
|
* Check if player is the target of this bounty.
|
|
*/
|
|
public boolean isTarget(UUID playerId) {
|
|
return targetId.equals(playerId);
|
|
}
|
|
|
|
/**
|
|
* Check if bounty matches (client receives target).
|
|
*/
|
|
public boolean matches(UUID clientId, UUID targetId) {
|
|
return this.clientId.equals(clientId) && this.targetId.equals(targetId);
|
|
}
|
|
|
|
// ==================== REWARD DESCRIPTION ====================
|
|
|
|
/**
|
|
* Get a description of the reward (e.g., "Diamond x 5").
|
|
*/
|
|
public String getRewardDescription() {
|
|
if (reward.isEmpty()) {
|
|
return "Nothing";
|
|
}
|
|
return reward.getHoverName().getString() + " x " + reward.getCount();
|
|
}
|
|
|
|
// ==================== NAME UPDATES ====================
|
|
|
|
/**
|
|
* Update client name (for when player was offline during creation).
|
|
*/
|
|
public void setClientName(String name) {
|
|
this.clientName = name;
|
|
}
|
|
|
|
/**
|
|
* Update target name (for when player was offline during creation).
|
|
*/
|
|
public void setTargetName(String name) {
|
|
this.targetName = name;
|
|
}
|
|
|
|
// ==================== NBT SERIALIZATION ====================
|
|
|
|
public CompoundTag save() {
|
|
CompoundTag tag = new CompoundTag();
|
|
tag.putString("id", id);
|
|
tag.putUUID("clientId", clientId);
|
|
tag.putUUID("targetId", targetId);
|
|
tag.putString("clientName", clientName);
|
|
tag.putString("targetName", targetName);
|
|
tag.put("reward", reward.save(new CompoundTag()));
|
|
tag.putLong("creationTime", creationTime);
|
|
tag.putInt("durationSeconds", durationSeconds);
|
|
return tag;
|
|
}
|
|
|
|
public static Bounty load(CompoundTag tag) {
|
|
return new Bounty(
|
|
tag.getString("id"),
|
|
tag.getUUID("clientId"),
|
|
tag.getString("clientName"),
|
|
tag.getUUID("targetId"),
|
|
tag.getString("targetName"),
|
|
ItemStack.of(tag.getCompound("reward")),
|
|
tag.getLong("creationTime"),
|
|
tag.getInt("durationSeconds")
|
|
);
|
|
}
|
|
}
|