2018-09-13 12:03:28 -04:00
|
|
|
package noppes.npcs;
|
|
|
|
|
|
2023-01-12 21:33:06 -05:00
|
|
|
import cpw.mods.fml.common.network.IGuiHandler;
|
2024-08-22 16:47:07 -04:00
|
|
|
import cpw.mods.fml.relauncher.Side;
|
|
|
|
|
import cpw.mods.fml.relauncher.SideOnly;
|
|
|
|
|
import net.minecraft.client.Minecraft;
|
2018-09-13 12:03:28 -04:00
|
|
|
import net.minecraft.client.model.ModelBiped;
|
2024-08-22 16:47:07 -04:00
|
|
|
import net.minecraft.entity.Entity;
|
2018-09-13 12:03:28 -04:00
|
|
|
import net.minecraft.entity.EntityLivingBase;
|
|
|
|
|
import net.minecraft.entity.player.EntityPlayer;
|
|
|
|
|
import net.minecraft.inventory.Container;
|
2022-01-12 04:44:08 -06:00
|
|
|
import net.minecraft.inventory.InventoryBasic;
|
2018-09-13 12:03:28 -04:00
|
|
|
import net.minecraft.item.Item;
|
2021-10-19 02:49:46 -05:00
|
|
|
import net.minecraft.stats.Achievement;
|
2018-09-13 12:03:28 -04:00
|
|
|
import net.minecraft.world.World;
|
2021-10-19 19:49:43 -05:00
|
|
|
import net.minecraftforge.common.util.FakePlayer;
|
2023-01-12 21:33:06 -05:00
|
|
|
import noppes.npcs.api.IWorld;
|
2018-09-13 12:03:28 -04:00
|
|
|
import noppes.npcs.blocks.tiles.TileNpcContainer;
|
|
|
|
|
import noppes.npcs.constants.EnumGuiType;
|
2022-01-12 04:44:08 -06:00
|
|
|
import noppes.npcs.containers.*;
|
2024-08-22 16:47:07 -04:00
|
|
|
import noppes.npcs.controllers.data.AnimationData;
|
|
|
|
|
import noppes.npcs.controllers.data.Frame;
|
2022-05-24 01:07:50 -05:00
|
|
|
import noppes.npcs.controllers.data.PlayerData;
|
2018-09-13 12:03:28 -04:00
|
|
|
import noppes.npcs.entity.EntityNPCInterface;
|
2024-08-22 16:47:07 -04:00
|
|
|
import noppes.npcs.util.MillisTimer;
|
2021-04-27 11:56:36 -04:00
|
|
|
|
2024-08-22 16:47:07 -04:00
|
|
|
import java.util.Collection;
|
|
|
|
|
import java.util.ConcurrentModificationException;
|
|
|
|
|
import java.util.HashSet;
|
2018-09-13 12:03:28 -04:00
|
|
|
|
2024-08-22 16:47:07 -04:00
|
|
|
public class CommonProxy implements IGuiHandler {
|
|
|
|
|
public final static HashSet<AnimationData> clientPlayingAnimations = new HashSet<>();
|
|
|
|
|
public final static HashSet<AnimationData> serverPlayingAnimations = new HashSet<>();
|
|
|
|
|
protected MillisTimer animationTimer = new MillisTimer(1000);
|
|
|
|
|
protected static long totalServerTicks;
|
|
|
|
|
protected static long totalClientTicks;
|
2024-03-24 03:14:11 -05:00
|
|
|
|
2024-05-26 19:26:47 -04:00
|
|
|
public void load() {
|
2024-08-22 16:47:07 -04:00
|
|
|
this.createAnimationThread();
|
|
|
|
|
|
2018-09-13 12:03:28 -04:00
|
|
|
CustomNpcs.Channel.register(new PacketHandlerServer());
|
|
|
|
|
CustomNpcs.ChannelPlayer.register(new PacketHandlerPlayer());
|
|
|
|
|
}
|
|
|
|
|
|
2024-08-22 16:47:07 -04:00
|
|
|
protected void createAnimationThread() {
|
|
|
|
|
Thread thread = (new Thread("Animation Thread") { public void run() {
|
|
|
|
|
while (true) {
|
|
|
|
|
try {
|
|
|
|
|
if (!CustomNpcs.proxy.hasClient() || !Minecraft.getMinecraft().isGamePaused()) {
|
|
|
|
|
animationTimer.updateTimer();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for (int i = 0; i < animationTimer.elapsedTicks; ++i) {
|
|
|
|
|
updateData(totalClientTicks, clientPlayingAnimations);
|
|
|
|
|
totalClientTicks++;
|
|
|
|
|
|
|
|
|
|
updateData(totalServerTicks, serverPlayingAnimations);
|
|
|
|
|
totalServerTicks++;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
totalClientTicks %= Long.MAX_VALUE;
|
|
|
|
|
totalServerTicks %= Long.MAX_VALUE;
|
|
|
|
|
|
|
|
|
|
synchronized (clientPlayingAnimations) {
|
|
|
|
|
clientPlayingAnimations.removeIf(CommonProxy.this::removeAnimation);
|
|
|
|
|
}
|
|
|
|
|
synchronized (serverPlayingAnimations) {
|
|
|
|
|
serverPlayingAnimations.removeIf(CommonProxy.this::removeAnimation);
|
|
|
|
|
}
|
|
|
|
|
} catch (Exception e) {
|
|
|
|
|
if (!(e instanceof ConcurrentModificationException)) {
|
|
|
|
|
e.printStackTrace();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}});
|
|
|
|
|
thread.setDaemon(true);
|
|
|
|
|
thread.start();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void updateData(long ticks, Collection<AnimationData> animationData) {
|
|
|
|
|
for (AnimationData data : animationData) {
|
|
|
|
|
Frame frame = data.animation != null && data.animation.currentFrame() != null
|
|
|
|
|
? (Frame) data.animation.currentFrame() : null;
|
|
|
|
|
if (frame != null) {
|
|
|
|
|
int tickDuration = frame.tickDuration();
|
|
|
|
|
if (ticks % tickDuration == 0) {
|
|
|
|
|
data.increaseTime();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private boolean removeAnimation(AnimationData data) {
|
|
|
|
|
Entity entity = null;
|
|
|
|
|
if (data.parent instanceof DataDisplay) {
|
|
|
|
|
entity = ((DataDisplay)data.parent).npc;
|
|
|
|
|
} else {
|
|
|
|
|
if (data.parent instanceof PlayerData) {
|
|
|
|
|
entity = ((PlayerData) data.parent).player;
|
|
|
|
|
} else if (data.parent instanceof EntityPlayer) {
|
|
|
|
|
entity = (EntityPlayer) data.parent;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (entity == null) return true;
|
|
|
|
|
|
|
|
|
|
if (entity.worldObj != null && entity.worldObj.isRemote) {
|
|
|
|
|
return clientRemoveAnimation(entity);
|
|
|
|
|
} else {
|
|
|
|
|
return entity.worldObj == null || !entity.worldObj.loadedEntityList.contains(entity)
|
|
|
|
|
|| CustomNpcs.getServer().isServerStopped();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@SideOnly(Side.CLIENT)
|
|
|
|
|
private boolean clientRemoveAnimation(Entity entity) {
|
|
|
|
|
Minecraft mc = Minecraft.getMinecraft();
|
|
|
|
|
return mc.theWorld == null
|
|
|
|
|
|| mc.currentScreen == null && entity != mc.thePlayer && !mc.theWorld.loadedEntityList.contains(entity);
|
|
|
|
|
}
|
|
|
|
|
|
2021-09-30 21:44:30 -05:00
|
|
|
public PlayerData getPlayerData(EntityPlayer player) {
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
|
2018-09-13 12:03:28 -04:00
|
|
|
@Override
|
|
|
|
|
public Object getServerGuiElement(int ID, EntityPlayer player, World world, int x, int y, int z) {
|
|
|
|
|
if(ID > EnumGuiType.values().length)
|
|
|
|
|
return null;
|
|
|
|
|
EntityNPCInterface npc = NoppesUtilServer.getEditingNpc(player);
|
|
|
|
|
EnumGuiType gui = EnumGuiType.values()[ID];
|
|
|
|
|
return getContainer(gui, player, x, y, z, npc);
|
|
|
|
|
}
|
|
|
|
|
public Container getContainer(EnumGuiType gui,EntityPlayer player, int x, int y, int z,EntityNPCInterface npc){
|
2022-01-12 04:44:08 -06:00
|
|
|
if(gui == EnumGuiType.CustomGui)
|
|
|
|
|
return new ContainerCustomGui(new InventoryBasic("", false, x));
|
|
|
|
|
|
2018-09-13 12:03:28 -04:00
|
|
|
if(gui == EnumGuiType.MainMenuInv)
|
|
|
|
|
return new ContainerNPCInv(npc, player);
|
|
|
|
|
|
|
|
|
|
if(gui == EnumGuiType.PlayerBankSmall)
|
|
|
|
|
return new ContainerNPCBankSmall(player, x , y);
|
2021-10-19 02:49:46 -05:00
|
|
|
|
2018-09-13 12:03:28 -04:00
|
|
|
if(gui == EnumGuiType.PlayerBankUnlock)
|
|
|
|
|
return new ContainerNPCBankUnlock(player, x , y);
|
|
|
|
|
|
|
|
|
|
if(gui == EnumGuiType.PlayerBankUprade)
|
|
|
|
|
return new ContainerNPCBankUpgrade(player, x , y);
|
2021-10-19 02:49:46 -05:00
|
|
|
|
2018-09-13 12:03:28 -04:00
|
|
|
if(gui == EnumGuiType.PlayerBankLarge)
|
|
|
|
|
return new ContainerNPCBankLarge(player, x , y);
|
|
|
|
|
|
|
|
|
|
if(gui == EnumGuiType.PlayerFollowerHire)
|
|
|
|
|
return new ContainerNPCFollowerHire(npc, player);
|
2021-10-19 02:49:46 -05:00
|
|
|
|
2018-09-13 12:03:28 -04:00
|
|
|
if(gui == EnumGuiType.PlayerFollower)
|
|
|
|
|
return new ContainerNPCFollower(npc, player);
|
2021-10-19 02:49:46 -05:00
|
|
|
|
2018-09-13 12:03:28 -04:00
|
|
|
if(gui == EnumGuiType.PlayerTrader)
|
|
|
|
|
return new ContainerNPCTrader(npc, player);
|
|
|
|
|
|
|
|
|
|
if(gui == EnumGuiType.PlayerAnvil)
|
|
|
|
|
return new ContainerCarpentryBench(player.inventory, player.worldObj, x, y, z);
|
2021-10-19 02:49:46 -05:00
|
|
|
|
2018-09-13 12:03:28 -04:00
|
|
|
if(gui == EnumGuiType.SetupItemGiver)
|
|
|
|
|
return new ContainerNpcItemGiver(npc, player);
|
2021-10-19 02:49:46 -05:00
|
|
|
|
2018-09-13 12:03:28 -04:00
|
|
|
if(gui == EnumGuiType.SetupTrader)
|
|
|
|
|
return new ContainerNPCTraderSetup(npc, player);
|
|
|
|
|
|
|
|
|
|
if(gui == EnumGuiType.SetupFollower)
|
|
|
|
|
return new ContainerNPCFollowerSetup(npc, player);
|
|
|
|
|
|
|
|
|
|
if(gui == EnumGuiType.QuestReward)
|
|
|
|
|
return new ContainerNpcQuestReward(player);
|
2021-10-19 02:49:46 -05:00
|
|
|
|
2018-09-13 12:03:28 -04:00
|
|
|
if(gui == EnumGuiType.QuestItem)
|
|
|
|
|
return new ContainerNpcQuestTypeItem(player);
|
2021-10-19 02:49:46 -05:00
|
|
|
|
2018-09-13 12:03:28 -04:00
|
|
|
if(gui == EnumGuiType.ManageRecipes)
|
|
|
|
|
return new ContainerManageRecipes(player,x);
|
|
|
|
|
|
|
|
|
|
if(gui == EnumGuiType.ManageBanks)
|
|
|
|
|
return new ContainerManageBanks(player);
|
|
|
|
|
|
|
|
|
|
if(gui == EnumGuiType.MerchantAdd)
|
|
|
|
|
return new ContainerMerchantAdd(player, ServerEventsHandler.Merchant, player.worldObj);
|
|
|
|
|
|
2023-05-17 11:43:43 -04:00
|
|
|
if(gui == EnumGuiType.Crate)
|
|
|
|
|
return new ContainerCrate(player.inventory, (TileNpcContainer)player.worldObj.getTileEntity(x, y, z));
|
2021-10-19 02:49:46 -05:00
|
|
|
|
2018-09-13 12:03:28 -04:00
|
|
|
if(gui == EnumGuiType.PlayerMailman)
|
|
|
|
|
return new ContainerMail(player, x == 1, y == 1);
|
2021-10-19 02:49:46 -05:00
|
|
|
|
2018-09-13 12:03:28 -04:00
|
|
|
if(gui == EnumGuiType.CompanionInv)
|
|
|
|
|
return new ContainerNPCCompanion(npc, player);
|
2021-10-19 02:49:46 -05:00
|
|
|
|
2018-09-13 12:03:28 -04:00
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public Object getClientGuiElement(int ID, EntityPlayer player, World world, int x, int y, int z) {
|
|
|
|
|
// TODO Auto-generated method stub
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void openGui(EntityNPCInterface npc, EnumGuiType gui) {
|
|
|
|
|
// TODO Auto-generated method stub
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void openGui(EntityNPCInterface npc, EnumGuiType gui, int x, int y, int z) {
|
|
|
|
|
// TODO Auto-generated method stub
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public void openGui(int i, int j, int k, EnumGuiType gui, EntityPlayer player) {
|
2021-10-19 02:49:46 -05:00
|
|
|
|
2018-09-13 12:03:28 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void openGui(EntityPlayer player, Object guiscreen) {
|
|
|
|
|
// TODO Auto-generated method stub
|
2021-10-19 02:49:46 -05:00
|
|
|
|
2018-09-13 12:03:28 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void spawnParticle(EntityLivingBase player, String string, Object... ob) {
|
|
|
|
|
// TODO Auto-generated method stub
|
2021-10-19 02:49:46 -05:00
|
|
|
|
2018-09-13 12:03:28 -04:00
|
|
|
}
|
|
|
|
|
|
2021-10-19 19:49:43 -05:00
|
|
|
public FakePlayer getCommandPlayer(IWorld world) { return null; }
|
|
|
|
|
|
2018-09-13 12:03:28 -04:00
|
|
|
public boolean hasClient() {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public EntityPlayer getPlayer() {
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void registerItem(Item item) {
|
|
|
|
|
// TODO Auto-generated method stub
|
2021-10-19 02:49:46 -05:00
|
|
|
|
2018-09-13 12:03:28 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public ModelBiped getSkirtModel() {
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void spawnParticle(String particle, double x, double y, double z,
|
2021-10-19 02:49:46 -05:00
|
|
|
double motionX, double motionY, double motionZ, float scale) {
|
|
|
|
|
|
2018-09-13 12:03:28 -04:00
|
|
|
}
|
|
|
|
|
|
2021-10-19 02:49:46 -05:00
|
|
|
public String getAchievementDesc(Achievement achievement) {
|
|
|
|
|
return "";
|
|
|
|
|
}
|
2021-11-16 10:41:04 -06:00
|
|
|
|
|
|
|
|
public boolean isGUIOpen(){
|
|
|
|
|
return false;
|
|
|
|
|
}
|
2024-08-22 16:47:07 -04:00
|
|
|
}
|