Add donor perks and tweak generalise rendering of healing totem
This commit is contained in:
@@ -0,0 +1,102 @@
|
||||
package electroblob.wizardry.misc;
|
||||
|
||||
import com.google.common.collect.ImmutableMap;
|
||||
import electroblob.wizardry.Wizardry;
|
||||
import electroblob.wizardry.constants.Element;
|
||||
import electroblob.wizardry.packet.PacketRequestDonationPerks;
|
||||
import electroblob.wizardry.packet.PacketSyncDonationPerks;
|
||||
import electroblob.wizardry.packet.WizardryPacketHandler;
|
||||
import electroblob.wizardry.util.Box;
|
||||
import net.minecraft.entity.player.EntityPlayer;
|
||||
import net.minecraft.entity.player.EntityPlayerMP;
|
||||
import net.minecraftforge.fml.common.Mod;
|
||||
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
|
||||
import net.minecraftforge.fml.common.gameevent.PlayerEvent.PlayerLoggedInEvent;
|
||||
import net.minecraftforge.fml.common.network.simpleimpl.IMessage;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.UUID;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/** Class responsible for storing and handling the donation perk settings for all eligible connected players */
|
||||
// We probably could have used WizardData for this, but since this is config-based and only for rendering it makes more
|
||||
// sense to handle it separately, especially given that the vast majority of players aren't donors
|
||||
@Mod.EventBusSubscriber
|
||||
public class DonationPerksHandler {
|
||||
|
||||
// Thanks to everyone who has donated their time and/or money! <3 (These are your UUIDs - don't worry, they're not
|
||||
// sensitive info, they're just player identifiers that won't ever change, even if you change your username)
|
||||
// Convert between usernames and UUIDs here https://mcuuid.net/
|
||||
// Normally I'd use an EnumMap for this, but somehow making the UUIDs into an enum doesn't seem right
|
||||
private static final Map<UUID, Box<Element>> DONOR_UUID_MAP = ImmutableMap.of(
|
||||
UUID.fromString("4b29263e-007b-48ef-b3e6-ce86cca989e9"), new Box<>(Element.MAGIC), // Me!
|
||||
UUID.fromString("2b583703-1407-4ec6-93d2-d9c03b0c08fc"), new Box<>(Element.MAGIC),
|
||||
UUID.fromString("f6c7001f-4ce8-43f7-b4a1-a9d9d5fadb93"), new Box<>(Element.MAGIC),
|
||||
UUID.fromString("01535a73-ff8d-4d6c-851e-c71f89e936aa"), new Box<>(Element.MAGIC)
|
||||
);
|
||||
|
||||
/** Returns true if the given player's UUID appears in the list of donor UUIDs, false otherwise (thread-safe). */
|
||||
public static boolean isDonor(EntityPlayer player){
|
||||
return DONOR_UUID_MAP.containsKey(player.getUniqueID());
|
||||
}
|
||||
|
||||
/** Sets each donor's perk element in order according to the given list. The given list <i>will</i> be modified. */
|
||||
public static void setElements(List<Element> elements){
|
||||
if(elements.size() < DONOR_UUID_MAP.size()){
|
||||
Wizardry.logger.warn("Received fewer perk settings than the number of donors, cannot sync!");
|
||||
return;
|
||||
}
|
||||
DONOR_UUID_MAP.forEach((k, v) -> v.set(elements.remove(0)));
|
||||
if(!elements.isEmpty()) Wizardry.logger.warn("Received more perk settings than the number of donors, something must have gone wrong!");
|
||||
}
|
||||
|
||||
/** Sets the donor perk to the given element for the given player and sends a packet to all clients if it changed. */
|
||||
public static void setElement(EntityPlayerMP player, Element element){
|
||||
Box<Element> box = DONOR_UUID_MAP.get(player.getUniqueID());
|
||||
if(box != null && box.get() != element){
|
||||
box.set(element);
|
||||
syncAll();
|
||||
}
|
||||
}
|
||||
|
||||
/** Returns the given player's donor perk element, or null if they are not a donor (may also be null for donors if
|
||||
* they have disabled the perk). */
|
||||
public static Element getElement(EntityPlayer player){
|
||||
Box<Element> box = DONOR_UUID_MAP.get(player.getUniqueID());
|
||||
return box == null ? null : box.get();
|
||||
}
|
||||
|
||||
/** Sends the current donor perk information to all connected players (server-side only). */
|
||||
private static void syncAll(){
|
||||
Wizardry.logger.info("Sending global donation perk settings to all players");
|
||||
PacketSyncDonationPerks.Message packet = new PacketSyncDonationPerks.Message(DONOR_UUID_MAP.values().stream().map(Box::get).collect(Collectors.toList()));
|
||||
WizardryPacketHandler.net.sendToAll(packet);
|
||||
}
|
||||
|
||||
/** Sends the current donor perk information to the given player (server-side only). */
|
||||
private static void syncWith(EntityPlayerMP player){
|
||||
Wizardry.logger.info("Sending global donation perk settings to {}", player.getName());
|
||||
PacketSyncDonationPerks.Message packet = new PacketSyncDonationPerks.Message(DONOR_UUID_MAP.values().stream().map(Box::get).collect(Collectors.toList()));
|
||||
WizardryPacketHandler.net.sendTo(packet, player);
|
||||
}
|
||||
|
||||
/** Sends the client player's donor perk setting to the server (client-side only) */
|
||||
public static void sendToServer(EntityPlayer player){
|
||||
Wizardry.logger.info("Sending donation perk settings for {} to server", player.getName());
|
||||
IMessage message = new PacketRequestDonationPerks.Message(Wizardry.settings.donationPerkElement);
|
||||
WizardryPacketHandler.net.sendToServer(message);
|
||||
}
|
||||
|
||||
@SubscribeEvent
|
||||
public static void onPlayerLoggedInEvent(PlayerLoggedInEvent event){
|
||||
if(event.player instanceof EntityPlayerMP){
|
||||
// Send donation perks to anyone who logs in
|
||||
syncWith((EntityPlayerMP)event.player);
|
||||
}else{
|
||||
// Send donation perks setting to the server if the player is a donor
|
||||
if(isDonor(event.player)) sendToServer(event.player);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user