Files
CustomNPC-Plus/src/main/java/noppes/npcs/ServerEventsHandler.java
T

417 lines
17 KiB
Java
Raw Normal View History

2018-09-13 12:03:28 -04:00
package noppes.npcs;
2022-11-07 01:49:54 -05:00
import cpw.mods.fml.common.FMLCommonHandler;
2018-09-13 12:03:28 -04:00
import cpw.mods.fml.common.eventhandler.SubscribeEvent;
2022-11-07 01:49:54 -05:00
import cpw.mods.fml.relauncher.Side;
2018-09-13 12:03:28 -04:00
import net.minecraft.block.Block;
import net.minecraft.entity.Entity;
import net.minecraft.entity.EntityList;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.entity.passive.EntityVillager;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.init.Blocks;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.nbt.NBTTagList;
import net.minecraft.server.MinecraftServer;
import net.minecraft.util.ChatComponentText;
import net.minecraft.util.ChatComponentTranslation;
import net.minecraft.util.MathHelper;
import net.minecraft.util.StatCollector;
import net.minecraft.village.MerchantRecipeList;
import net.minecraftforge.event.entity.EntityJoinWorldEvent;
2024-01-22 12:04:09 -06:00
import net.minecraftforge.event.entity.living.LivingAttackEvent;
2018-09-13 12:03:28 -04:00
import net.minecraftforge.event.entity.living.LivingDeathEvent;
import net.minecraftforge.event.entity.living.LivingHurtEvent;
import net.minecraftforge.event.entity.player.EntityInteractEvent;
import net.minecraftforge.event.entity.player.EntityItemPickupEvent;
import net.minecraftforge.event.entity.player.PlayerEvent;
2018-09-13 12:03:28 -04:00
import net.minecraftforge.event.entity.player.PlayerInteractEvent;
import net.minecraftforge.event.entity.player.PlayerInteractEvent.Action;
import net.minecraftforge.event.terraingen.PopulateChunkEvent;
import noppes.npcs.blocks.tiles.TileBanner;
2023-01-07 00:21:08 -05:00
import noppes.npcs.config.ConfigDebug;
import noppes.npcs.config.ConfigMain;
2018-09-13 12:03:28 -04:00
import noppes.npcs.constants.EnumGuiType;
import noppes.npcs.constants.EnumPacketClient;
import noppes.npcs.constants.EnumQuestType;
import noppes.npcs.constants.EnumRoleType;
2023-01-12 21:33:06 -05:00
import noppes.npcs.controllers.PlayerDataController;
import noppes.npcs.controllers.RecipeController;
import noppes.npcs.controllers.ServerCloneController;
import noppes.npcs.controllers.data.*;
2018-09-13 12:03:28 -04:00
import noppes.npcs.entity.EntityNPCInterface;
import noppes.npcs.items.ItemExcalibur;
import noppes.npcs.items.ItemShield;
import noppes.npcs.items.ItemSoulstoneEmpty;
2022-06-13 04:08:36 -05:00
import noppes.npcs.quests.QuestItem;
2018-09-13 12:03:28 -04:00
import noppes.npcs.quests.QuestKill;
import noppes.npcs.roles.RoleFollower;
2023-01-12 21:33:06 -05:00
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
2018-09-13 12:03:28 -04:00
public class ServerEventsHandler {
public static EntityVillager Merchant;
public static Entity mounted;
2021-12-22 03:33:50 -06:00
2018-09-13 12:03:28 -04:00
@SubscribeEvent
public void invoke(EntityInteractEvent event) {
ItemStack item = event.entityPlayer.getCurrentEquippedItem();
if(item == null)
return;
boolean isRemote = event.entityPlayer.worldObj.isRemote;
boolean npcInteracted = event.target instanceof EntityNPCInterface;
2023-01-07 00:21:08 -05:00
if(!isRemote && ConfigMain.OpsOnly && !MinecraftServer.getServer().getConfigurationManager().func_152596_g(event.entityPlayer.getGameProfile())){
2018-09-13 12:03:28 -04:00
return;
}
2021-12-22 03:33:50 -06:00
2018-09-13 12:03:28 -04:00
if(!isRemote && item.getItem() == CustomItems.soulstoneEmpty && event.target instanceof EntityLivingBase) {
2021-12-22 03:33:50 -06:00
((ItemSoulstoneEmpty)item.getItem()).store((EntityLivingBase)event.target, item, event.entityPlayer);
2023-01-07 00:21:08 -05:00
if(ConfigDebug.PlayerLogging && FMLCommonHandler.instance().getEffectiveSide() == Side.SERVER){
2022-11-07 01:49:54 -05:00
LogWriter.script(String.format("[%s] (Player) %s PICKED ENTITY %s", "SOULSTONE", event.entityPlayer.getCommandSenderName(), event.target));
}
2018-09-13 12:03:28 -04:00
}
2021-12-22 03:33:50 -06:00
2018-09-13 12:03:28 -04:00
if(item.getItem() == CustomItems.wand && npcInteracted && !isRemote){
if (!CustomNpcsPermissions.Instance.hasPermission(event.entityPlayer, CustomNpcsPermissions.NPC_GUI)){
return;
}
event.setCanceled(true);
NoppesUtilServer.sendOpenGui(event.entityPlayer, EnumGuiType.MainMenuDisplay, (EntityNPCInterface) event.target);
2023-01-07 00:21:08 -05:00
if(ConfigDebug.PlayerLogging && FMLCommonHandler.instance().getEffectiveSide() == Side.SERVER){
2022-11-07 01:49:54 -05:00
LogWriter.script(String.format("[%s] (Player) %s OPEN NPC %s (%s, %s, %s) [%s]", "WAND", event.entityPlayer.getCommandSenderName(), ((EntityNPCInterface)(event.target)).display.getName(), (int)(event.target).posX, (int)(event.target).posY, (int)(event.target).posZ, (event.target).worldObj.getWorldInfo().getWorldName()));
}
2018-09-13 12:03:28 -04:00
}
else if(item.getItem() == CustomItems.cloner && !isRemote && !(event.target instanceof EntityPlayer)){
2024-02-19 19:14:51 -05:00
if(!CustomNpcsPermissions.Instance.hasPermission(event.entityPlayer, CustomNpcsPermissions.TOOL_CLONER))
return;
2018-09-13 12:03:28 -04:00
NBTTagCompound compound = new NBTTagCompound();
if(!event.target.writeToNBTOptional(compound))
return;
2023-06-05 19:35:27 -04:00
PlayerData data = PlayerDataController.Instance.getPlayerData(event.entityPlayer);
2018-09-13 12:03:28 -04:00
ServerCloneController.Instance.cleanTags(compound);
if(!Server.sendDataChecked((EntityPlayerMP)event.entityPlayer, EnumPacketClient.CLONE, compound))
2018-09-13 12:03:28 -04:00
event.entityPlayer.addChatMessage(new ChatComponentText("Entity too big to clone"));
data.cloned = compound;
if (event.target instanceof EntityNPCInterface) {
NoppesUtilServer.setEditingNpc(event.entityPlayer, (EntityNPCInterface) event.target);
}
2018-09-13 12:03:28 -04:00
event.setCanceled(true);
}
else if(item.getItem() == CustomItems.scripter && !isRemote && npcInteracted){
2024-02-19 19:14:51 -05:00
if(!CustomNpcsPermissions.Instance.hasPermission(event.entityPlayer, CustomNpcsPermissions.TOOL_SCRIPTER))
2018-09-13 12:03:28 -04:00
return;
2021-12-22 03:33:50 -06:00
NoppesUtilServer.setEditingNpc(event.entityPlayer, (EntityNPCInterface)event.target);
2018-09-13 12:03:28 -04:00
event.setCanceled(true);
2021-12-22 03:33:50 -06:00
Server.sendData((EntityPlayerMP)event.entityPlayer, EnumPacketClient.GUI, EnumGuiType.Script.ordinal());
2023-01-07 00:21:08 -05:00
if(ConfigDebug.PlayerLogging && FMLCommonHandler.instance().getEffectiveSide() == Side.SERVER){
2022-11-07 01:49:54 -05:00
LogWriter.script(String.format("[%s] (Player) %s OPEN NPC %s (%s, %s, %s) [%s]", "SCRIPTER", event.entityPlayer.getCommandSenderName(), ((EntityNPCInterface)(event.target)).display.getName(), (int)(event.target).posX, (int)(event.target).posY, (int)(event.target).posZ, (event.target).worldObj.getWorldInfo().getWorldName()));
}
2018-09-13 12:03:28 -04:00
}
else if(item.getItem() == CustomItems.mount){
if(!CustomNpcsPermissions.Instance.hasPermission(event.entityPlayer, CustomNpcsPermissions.TOOL_MOUNTER))
return;
event.setCanceled(true);
2021-12-22 03:33:50 -06:00
mounted = event.target;
if(isRemote)
CustomNpcs.proxy.openGui(MathHelper.floor_double(mounted.posX), MathHelper.floor_double(mounted.posY), MathHelper.floor_double(mounted.posZ), EnumGuiType.MobSpawnerMounter, event.entityPlayer);
2018-09-13 12:03:28 -04:00
}
else if(item.getItem() == CustomItems.wand && event.target instanceof EntityVillager){
if(!CustomNpcsPermissions.Instance.hasPermission(event.entityPlayer, CustomNpcsPermissions.EDIT_VILLAGER))
return;
event.setCanceled(true);
Merchant = (EntityVillager)event.target;
2021-12-22 03:33:50 -06:00
2018-09-13 12:03:28 -04:00
if(!isRemote){
EntityPlayerMP player = (EntityPlayerMP) event.entityPlayer;
player.openGui(CustomNpcs.instance, EnumGuiType.MerchantAdd.ordinal(), player.worldObj, 0, 0, 0);
2021-12-22 03:33:50 -06:00
MerchantRecipeList merchantrecipelist = Merchant.getRecipes(player);
if (merchantrecipelist != null)
{
Server.sendData(player, EnumPacketClient.VILLAGER_LIST, merchantrecipelist);
}
2018-09-13 12:03:28 -04:00
}
}
2024-01-22 12:04:09 -06:00
}
@SubscribeEvent
public void invoke(LivingAttackEvent event) {
if(!(event.source != null && event.source.getEntity() instanceof EntityPlayer) || !(event.entityLiving instanceof EntityPlayer) || FMLCommonHandler.instance().getEffectiveSide().isClient())
return;
2021-12-22 03:33:50 -06:00
2024-01-22 12:04:09 -06:00
EntityPlayer sourcePlayer = (EntityPlayer) event.source.getEntity();
PlayerData playerData = PlayerDataController.Instance.getPlayerData(sourcePlayer);
PlayerData targetData = PlayerDataController.Instance.getPlayerData((EntityPlayer) event.entityLiving);
if (playerData.partyUUID != null && playerData.partyUUID.equals(targetData.partyUUID)) {
event.setCanceled(true);
}
2018-09-13 12:03:28 -04:00
}
2021-12-22 03:33:50 -06:00
2018-09-13 12:03:28 -04:00
@SubscribeEvent
public void invoke(LivingHurtEvent event) {
if(!(event.entityLiving instanceof EntityPlayer))
return;
2021-12-22 03:33:50 -06:00
2018-09-13 12:03:28 -04:00
EntityPlayer player = (EntityPlayer) event.entityLiving;
if(event.source.isUnblockable() || event.source.isFireDamage())
return;
if(!player.isBlocking())
return;
ItemStack item = player.getCurrentEquippedItem();
if(item == null || !(item.getItem() instanceof ItemShield))
return;
if(((ItemShield)item.getItem()).material.getDamageVsEntity() < player.getRNG().nextInt(9))
return;
float damage = item.getItemDamage() + event.ammount;
2021-12-22 03:33:50 -06:00
2018-09-13 12:03:28 -04:00
item.damageItem((int) event.ammount, player);
if(damage > item.getMaxDamage())
event.ammount = damage - item.getMaxDamage();
else{
event.ammount = 0;
event.setCanceled(true);
}
}
2021-12-22 03:33:50 -06:00
2018-09-13 12:03:28 -04:00
@SubscribeEvent
public void invoke(PlayerInteractEvent event) {
EntityPlayer player = event.entityPlayer;
Block block = player.worldObj.getBlock(event.x, event.y, event.z);
if(event.action == Action.LEFT_CLICK_BLOCK && player.getHeldItem() != null && player.getHeldItem().getItem() == CustomItems.teleporter){
event.setCanceled(true);
}
2021-12-22 03:33:50 -06:00
2018-09-13 12:03:28 -04:00
if(block == Blocks.crafting_table && event.action == Action.RIGHT_CLICK_BLOCK && !player.worldObj.isRemote){
2023-06-05 22:12:48 -04:00
RecipeController controller = RecipeController.Instance;
2021-12-22 03:33:50 -06:00
NBTTagList list = new NBTTagList();
int i = 0;
for(RecipeCarpentry recipe : controller.globalRecipes.values()){
list.appendTag(recipe.writeNBT());
i++;
if(i % 10 == 0){
NBTTagCompound compound = new NBTTagCompound();
compound.setTag("recipes", list);
Server.sendData((EntityPlayerMP)player, EnumPacketClient.SYNCRECIPES_ADD, compound);
list = new NBTTagList();
}
}
if(i % 10 != 0){
NBTTagCompound compound = new NBTTagCompound();
compound.setTag("recipes", list);
Server.sendData((EntityPlayerMP)player, EnumPacketClient.SYNCRECIPES_ADD, compound);
}
Server.sendData((EntityPlayerMP)player, EnumPacketClient.SYNCRECIPES_WORKBENCH);
}
2018-09-13 12:03:28 -04:00
if(block == CustomItems.carpentyBench && event.action == Action.RIGHT_CLICK_BLOCK && !player.worldObj.isRemote){
2023-06-05 22:12:48 -04:00
RecipeController controller = RecipeController.Instance;
2021-12-22 03:33:50 -06:00
NBTTagList list = new NBTTagList();
int i = 0;
for(RecipeCarpentry recipe : controller.anvilRecipes.values()){
list.appendTag(recipe.writeNBT());
i++;
if(i % 10 == 0){
NBTTagCompound compound = new NBTTagCompound();
compound.setTag("recipes", list);
Server.sendData((EntityPlayerMP)player, EnumPacketClient.SYNCRECIPES_ADD, compound);
list = new NBTTagList();
}
}
if(i % 10 != 0){
NBTTagCompound compound = new NBTTagCompound();
compound.setTag("recipes", list);
Server.sendData((EntityPlayerMP)player, EnumPacketClient.SYNCRECIPES_ADD, compound);
}
Server.sendData((EntityPlayerMP)player, EnumPacketClient.SYNCRECIPES_CARPENTRYBENCH);
2018-09-13 12:03:28 -04:00
}
if((block == CustomItems.banner || block == CustomItems.wallBanner || block == CustomItems.sign) && event.action == Action.RIGHT_CLICK_BLOCK){
ItemStack item = player.inventory.getCurrentItem();
if(item == null || item.getItem() == null)
return;
int y = event.y;
int meta = player.worldObj.getBlockMetadata(event.x, event.y, event.z);
if(meta >= 7)
y--;
TileBanner tile = (TileBanner)player.worldObj.getTileEntity(event.x, y, event.z);
if(!tile.canEdit()){
2021-12-22 03:33:50 -06:00
if(item.getItem() == CustomItems.wand && CustomNpcsPermissions.hasPermission(player, CustomNpcsPermissions.EDIT_BLOCKS)){
tile.time = System.currentTimeMillis();
if(player.worldObj.isRemote)
player.addChatComponentMessage(new ChatComponentTranslation("availability.editIcon"));
}
2018-09-13 12:03:28 -04:00
return;
}
2021-12-22 03:33:50 -06:00
if(!player.worldObj.isRemote){
2018-09-13 12:03:28 -04:00
tile.icon = item.copy();
2021-12-22 03:33:50 -06:00
player.worldObj.markBlockForUpdate(event.x, y, event.z);
event.setCanceled(true);
}
2018-09-13 12:03:28 -04:00
}
}
@SubscribeEvent
public void invoke(LivingDeathEvent event) {
if(event.entityLiving.worldObj.isRemote)
return;
if(event.source.getEntity() != null){
if(event.source.getEntity() instanceof EntityPlayer){
doExcalibur((EntityPlayer) event.source.getEntity(),event.entityLiving);
}
2021-12-22 03:33:50 -06:00
2023-05-21 02:48:30 -05:00
if(event.source.getEntity() instanceof EntityNPCInterface){
2018-09-13 12:03:28 -04:00
EntityNPCInterface npc = (EntityNPCInterface) event.source.getEntity();
Line line = npc.advanced.getKillLine();
if(line != null)
npc.saySurrounding(line.formatTarget(event.entityLiving));
2022-03-23 03:54:06 -05:00
EventHooks.onNPCKilledEntity(npc,event.entityLiving);
2018-09-13 12:03:28 -04:00
}
2021-12-22 03:33:50 -06:00
2018-09-13 12:03:28 -04:00
EntityPlayer player = null;
if(event.source.getEntity() instanceof EntityPlayer)
player = (EntityPlayer) event.source.getEntity();
else if(event.source.getEntity() instanceof EntityNPCInterface && ((EntityNPCInterface)event.source.getEntity()).advanced.role == EnumRoleType.Follower)
player = ((RoleFollower)((EntityNPCInterface)event.source.getEntity()).roleInterface).owner;
if(player != null){
doQuest(player, event.entityLiving, true);
2021-12-22 03:33:50 -06:00
2018-09-13 12:03:28 -04:00
if(event.entityLiving instanceof EntityNPCInterface)
doFactionPoints(player, (EntityNPCInterface)event.entityLiving);
}
}
if(event.entityLiving instanceof EntityPlayer){
2023-06-05 19:35:27 -04:00
PlayerData data = PlayerDataController.Instance.getPlayerData((EntityPlayer)event.entityLiving);
data.save();
2018-09-13 12:03:28 -04:00
}
}
@SubscribeEvent
public void onPlayerClone(PlayerEvent.Clone event) {
if (event.entity.worldObj.isRemote)
return;
NBTTagCompound storedData = event.original.getEntityData().getCompoundTag("CNPCStoredData");
if (!storedData.hasNoTags()) {
event.entityPlayer.getEntityData().setTag("CNPCStoredData", storedData);
}
}
2018-09-13 12:03:28 -04:00
private void doExcalibur(EntityPlayer player, EntityLivingBase entity) {
ItemStack item = player.getCurrentEquippedItem();
if(item == null || item.getItem() != CustomItems.excalibur)
return;
Server.sendData((EntityPlayerMP)player, EnumPacketClient.PLAY_MUSIC, "customnpcs:songs.excalibur");
player.addChatMessage(new ChatComponentTranslation("<" + StatCollector.translateToLocal(item.getItem().getUnlocalizedName() + ".name") + "> " + ItemExcalibur.quotes[player.getRNG().nextInt(ItemExcalibur.quotes.length)]));
}
private void doFactionPoints(EntityPlayer player, EntityNPCInterface npc) {
npc.advanced.factions.addPoints(player);
}
private void doQuest(EntityPlayer player, EntityLivingBase entity, boolean all) {
2023-06-05 19:35:27 -04:00
PlayerData playerData = PlayerDataController.Instance.getPlayerData(player);
PlayerQuestData questData = playerData.questData;
boolean checkCompletion = false;
2021-12-22 03:33:50 -06:00
String entityName = EntityList.getEntityString(entity);
ArrayList<QuestData> activeQuestValues = new ArrayList<>(questData.activeQuests.values());
for(QuestData data : activeQuestValues){
if (data.quest.type != EnumQuestType.Kill && data.quest.type != EnumQuestType.AreaKill)
2018-09-13 12:03:28 -04:00
continue;
if (data.quest.type == EnumQuestType.AreaKill && all) {
2018-09-13 12:03:28 -04:00
List<EntityPlayer> list = player.worldObj.getEntitiesWithinAABB(EntityPlayer.class, entity.boundingBox.expand(10, 10, 10));
for (EntityPlayer pl : list) {
if (pl != player) {
2018-09-13 12:03:28 -04:00
doQuest(pl, entity, false);
}
}
2018-09-13 12:03:28 -04:00
}
String name = entityName;
QuestKill quest = (QuestKill) data.quest.questInterface;
2022-02-02 22:11:49 -06:00
Class entityType = EntityNPCInterface.class;
if (quest.targetType == 2) {
2022-02-02 22:11:49 -06:00
try {
entityType = Class.forName(quest.customTargetType);
} catch (ClassNotFoundException notFoundException) {
continue;
}
}
if (quest.targetType > 0 && !(entityType.isInstance(entity)))
continue;
if (quest.targets.containsKey(entity.getCommandSenderName()))
2018-09-13 12:03:28 -04:00
name = entity.getCommandSenderName();
else if (!quest.targets.containsKey(name))
2018-09-13 12:03:28 -04:00
continue;
checkCompletion = true;
2018-09-13 12:03:28 -04:00
HashMap<String, Integer> killed = quest.getKilled(data);
if (!killed.containsKey(name)) {
killed.put(name, 1);
} else if(killed.get(name) < quest.targets.get(name)) {
int amount = killed.get(name);
killed.put(name, amount + 1);
}
2018-09-13 12:03:28 -04:00
quest.setKilled(data, killed);
}
if(!checkCompletion)
2018-09-13 12:03:28 -04:00
return;
2021-12-22 03:33:50 -06:00
questData.checkQuestCompletion(playerData,EnumQuestType.Kill);
2018-09-13 12:03:28 -04:00
}
@SubscribeEvent
public void pickUp(EntityItemPickupEvent event){
if(event.entityPlayer.worldObj.isRemote)
return;
2023-06-05 19:35:27 -04:00
PlayerData playerData = PlayerDataController.Instance.getPlayerData(event.entityPlayer);
PlayerQuestData questData = playerData.questData;
2022-06-13 04:08:36 -05:00
QuestItem.pickedUp = event.item.getEntityItem();
questData.checkQuestCompletion(playerData, EnumQuestType.Item);
2018-09-13 12:03:28 -04:00
}
@SubscribeEvent
public void world(PlayerEvent.SaveToFile event){
2023-06-05 19:35:27 -04:00
PlayerData data = PlayerDataController.Instance.getPlayerData((EntityPlayer) event.entity);
data.save();
2023-05-21 02:48:30 -05:00
}
2018-09-13 12:03:28 -04:00
@SubscribeEvent
public void world(EntityJoinWorldEvent event){
if(event.world.isRemote || !(event.entity instanceof EntityPlayer))
return;
2023-06-05 19:35:27 -04:00
PlayerData data = PlayerDataController.Instance.getPlayerData((EntityPlayer) event.entity);
2018-09-13 12:03:28 -04:00
data.updateCompanion(event.world);
}
@SubscribeEvent
public void populateChunk(PopulateChunkEvent.Post event){
NPCSpawning.performWorldGenSpawning(event.world, event.chunkX, event.chunkZ, event.rand);
}
2024-02-21 03:02:39 -05:00
@SubscribeEvent
public void playerTracking(PlayerEvent.StartTracking event){
if(!(event.target instanceof EntityNPCInterface) || event.target.worldObj.isRemote)
return;
MarkData data = MarkData.get((EntityNPCInterface) event.target);
if(data.marks.isEmpty())
return;
Server.sendData((EntityPlayerMP)event.entityPlayer, EnumPacketClient.MARK_DATA, event.target.getEntityId(), data.getNBT());
}
2024-02-19 19:14:51 -05:00
}