diff --git a/dynamicspawncontrol-1.12.2/src/main/java/org/imesense/dynamicspawncontrol/DynamicSpawnControl.java b/dynamicspawncontrol-1.12.2/src/main/java/org/imesense/dynamicspawncontrol/DynamicSpawnControl.java index a77a7c0..af80952 100644 --- a/dynamicspawncontrol-1.12.2/src/main/java/org/imesense/dynamicspawncontrol/DynamicSpawnControl.java +++ b/dynamicspawncontrol-1.12.2/src/main/java/org/imesense/dynamicspawncontrol/DynamicSpawnControl.java @@ -2,7 +2,6 @@ import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.fml.common.Mod; -import net.minecraftforge.fml.common.Mod.EventHandler; import net.minecraftforge.fml.common.SidedProxy; import net.minecraftforge.fml.common.event.FMLInitializationEvent; import net.minecraftforge.fml.common.event.FMLLoadCompleteEvent; @@ -11,7 +10,13 @@ import net.minecraftforge.fml.common.event.FMLServerStartingEvent; import net.minecraftforge.fml.common.event.FMLServerStoppedEvent; +import net.minecraftforge.fml.common.network.NetworkRegistry; +import net.minecraftforge.fml.common.network.simpleimpl.SimpleNetworkWrapper; +import org.imesense.dynamicspawncontrol.ai.spider.utils.event.EventHandler; +import org.imesense.dynamicspawncontrol.ai.spider.utils.attackweb.WebSlingerCapability; import org.imesense.dynamicspawncontrol.debug.CheckDebugger; +import org.imesense.dynamicspawncontrol.gameplay.recipes.IRecipes; +import org.imesense.dynamicspawncontrol.gameplay.recipes.CraftItemWeb; import org.imesense.dynamicspawncontrol.technical.eventprocessor.primitive.OnUpdateTimeWorld; import org.imesense.dynamicspawncontrol.technical.eventprocessor.primitive.OnWindowTitle; import org.imesense.dynamicspawncontrol.technical.initializer.RegisterCfgClasses; @@ -21,6 +26,7 @@ import org.imesense.dynamicspawncontrol.technical.gamestructures.Structures; import org.imesense.dynamicspawncontrol.technical.initializer.RegisterTechnicalClasses; import org.imesense.dynamicspawncontrol.technical.network.MessageHandler; +import org.imesense.dynamicspawncontrol.technical.network.PlayerInWebMessage; import org.imesense.dynamicspawncontrol.technical.parsers.GeneralStorageData; import org.imesense.dynamicspawncontrol.technical.parsers.ParserGenericJsonScripts; import org.imesense.dynamicspawncontrol.technical.parsers.ParserManager; @@ -29,7 +35,6 @@ import org.imesense.dynamicspawncontrol.technical.worldcache.CacheStorage; import java.io.File; -import java.io.IOException; /** * Main class of modification @@ -144,6 +149,11 @@ public static File getGlobalPathToConfigs() ) public static IProxy Proxy; + /** + * + */ + public static IRecipes Recipes; + /** * Constructor */ @@ -158,12 +168,17 @@ public DynamicSpawnControl() */ public GeneralStorageData generalStorageData = null; + /** + * + */ + public static SimpleNetworkWrapper networkWrapper = null; + /** * Preinitialize modification * * @param event Preinitialization event */ - @EventHandler + @Mod.EventHandler public synchronized void preInit(FMLPreInitializationEvent event) { // @@ -179,6 +194,10 @@ public synchronized void preInit(FMLPreInitializationEvent event) // MessageHandler.init(); + WebSlingerCapability.register(); + networkWrapper = NetworkRegistry.INSTANCE.newSimpleChannel("dynamicspawncontrol"); + PlayerInWebMessage.register(networkWrapper); + // RegisterCfgClasses.initializeConfigs(); @@ -212,11 +231,18 @@ public synchronized void preInit(FMLPreInitializationEvent event) * * @param event Initialization event */ - @EventHandler + @Mod.EventHandler public synchronized void init(FMLInitializationEvent event) { + // Proxy.init(event); + // + Recipes = new CraftItemWeb(); + + // + Recipes.registry(); + MinecraftForge.EVENT_BUS.register(OnUpdateTimeWorld.INSTANCE); } @@ -225,11 +251,13 @@ public synchronized void init(FMLInitializationEvent event) * * @param event Postinitialization event */ - @EventHandler + @Mod.EventHandler public synchronized void postInit(FMLPostInitializationEvent event) { // Proxy.postInit(event); + + MinecraftForge.EVENT_BUS.register( new EventHandler()); } /** @@ -237,7 +265,7 @@ public synchronized void postInit(FMLPostInitializationEvent event) * * @param event Load complete event */ - @EventHandler + @Mod.EventHandler public synchronized void onLoadComplete(FMLLoadCompleteEvent event) { ParserGenericJsonScripts.readRules(); @@ -250,7 +278,7 @@ public synchronized void onLoadComplete(FMLLoadCompleteEvent event) * * @param event Server starting event */ - @EventHandler + @Mod.EventHandler public synchronized void serverLoad(FMLServerStartingEvent event) { RegisterCommandsClasses.registerCommands(event); @@ -261,7 +289,7 @@ public synchronized void serverLoad(FMLServerStartingEvent event) * * @param event Server stopped action */ - @EventHandler + @Mod.EventHandler public synchronized void serverStopped(FMLServerStoppedEvent event) { Cache.instance.cleanActualCache(); diff --git a/dynamicspawncontrol-1.12.2/src/main/java/org/imesense/dynamicspawncontrol/ai/spider/AISpiderWebAttackTask.java b/dynamicspawncontrol-1.12.2/src/main/java/org/imesense/dynamicspawncontrol/ai/spider/AISpiderWebAttackTask.java deleted file mode 100644 index f1d6de9..0000000 --- a/dynamicspawncontrol-1.12.2/src/main/java/org/imesense/dynamicspawncontrol/ai/spider/AISpiderWebAttackTask.java +++ /dev/null @@ -1,4 +0,0 @@ -package org.imesense.dynamicspawncontrol.ai.spider; - -public class AISpiderWebAttackTask { -} diff --git a/dynamicspawncontrol-1.12.2/src/main/java/org/imesense/dynamicspawncontrol/ai/spider/task/AISpiderWebAttackTask.java b/dynamicspawncontrol-1.12.2/src/main/java/org/imesense/dynamicspawncontrol/ai/spider/task/AISpiderWebAttackTask.java new file mode 100644 index 0000000..d155309 --- /dev/null +++ b/dynamicspawncontrol-1.12.2/src/main/java/org/imesense/dynamicspawncontrol/ai/spider/task/AISpiderWebAttackTask.java @@ -0,0 +1,63 @@ +package org.imesense.dynamicspawncontrol.ai.spider.task; + +import net.minecraft.entity.EntityLiving; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.ai.EntityAIBase; +import net.minecraft.world.World; +import org.imesense.dynamicspawncontrol.ai.spider.utils.attackweb.EntityThrowableWeb; +import org.imesense.dynamicspawncontrol.technical.config.spiderattackweb.DataSpiderAttackWeb; + +public class AISpiderWebAttackTask extends EntityAIBase +{ + private int attackTimer; + private final EntityLiving parentEntity; + + public AISpiderWebAttackTask(EntityLiving entity) + { + this.parentEntity = entity; + } + + public boolean shouldExecute() + { + EntityLivingBase entitylivingbase = this.parentEntity != null ? this.parentEntity.getAttackTarget() : null; + return entitylivingbase != null ? entitylivingbase.getDistanceSq(this.parentEntity) >= 4.0D : false; + } + + public void startExecuting() + { + this.attackTimer = 0; + } + + public void resetTask() + { + super.resetTask(); + } + + public void updateTask() + { + EntityLivingBase entitylivingbase = this.parentEntity != null ? this.parentEntity.getAttackTarget() : null; + + if (this.parentEntity != null && entitylivingbase != null && entitylivingbase.getDistanceSq(this.parentEntity) < 256.0D && this.parentEntity.canEntityBeSeen(entitylivingbase)) + { + World world = this.parentEntity.world; + + ++this.attackTimer; + + if (this.attackTimer >= DataSpiderAttackWeb.ConfigDataSpiderAttackWeb.instance.getSlingCooldown()) + { + EntityThrowableWeb.sling(world, this.parentEntity); + + double cooldown = + (double)DataSpiderAttackWeb.ConfigDataSpiderAttackWeb.instance.getSlingCooldown() + + (double)((float)DataSpiderAttackWeb.ConfigDataSpiderAttackWeb.instance.getSlingCooldown() * + world.rand.nextFloat()) * DataSpiderAttackWeb.ConfigDataSpiderAttackWeb.instance.getSlingVariance(); + + this.attackTimer = (int)((double)this.attackTimer - cooldown); + } + } + else if (this.attackTimer > 0) + { + --this.attackTimer; + } + } +} diff --git a/dynamicspawncontrol-1.12.2/src/main/java/org/imesense/dynamicspawncontrol/ai/spider/utils/attackweb/EntityThrowableWeb.java b/dynamicspawncontrol-1.12.2/src/main/java/org/imesense/dynamicspawncontrol/ai/spider/utils/attackweb/EntityThrowableWeb.java new file mode 100644 index 0000000..8fef3da --- /dev/null +++ b/dynamicspawncontrol-1.12.2/src/main/java/org/imesense/dynamicspawncontrol/ai/spider/utils/attackweb/EntityThrowableWeb.java @@ -0,0 +1,187 @@ +package org.imesense.dynamicspawncontrol.ai.spider.utils.attackweb; + +import net.minecraft.block.Block; +import net.minecraft.block.state.IBlockState; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.entity.projectile.EntityThrowable; +import net.minecraft.init.Blocks; +import net.minecraft.util.DamageSource; +import net.minecraft.util.EnumParticleTypes; +import net.minecraft.util.SoundCategory; +import net.minecraft.util.datafix.DataFixer; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.RayTraceResult; +import net.minecraft.world.World; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; +import org.imesense.dynamicspawncontrol.DynamicSpawnControl; +import org.imesense.dynamicspawncontrol.technical.config.spiderattackweb.DataSpiderAttackWeb; +import org.imesense.dynamicspawncontrol.technical.customlibrary.ObjectHandler; +import org.imesense.dynamicspawncontrol.technical.network.PlayerInWebMessage; + +public class EntityThrowableWeb extends EntityThrowable +{ + public static final EnumParticleTypes particleType; + + public EntityThrowableWeb(World worldIn) + { + super(worldIn); + this.init(); + } + + public EntityThrowableWeb(World worldIn, EntityLivingBase throwerIn) + { + super(worldIn, throwerIn); + this.init(); + } + + public EntityThrowableWeb(World worldIn, double x, double y, double z) + { + super(worldIn, x, y, z); + this.init(); + } + + public EntityThrowableWeb(World worldIn, double x, double y, double z, double accelX, double accelY, double accelZ) + { + super(worldIn); + this.setSize(1.0F, 1.0F); + this.setLocationAndAngles(x, y, z, this.rotationYaw, this.rotationPitch); + this.setPosition(x, y, z); + this.init(); + } + + protected void init() + { + + } + + public static void registerFixesWebbing(DataFixer fixer) + { + EntityThrowable.registerFixesThrowable(fixer, "webbing"); + } + + @SideOnly(Side.CLIENT) + public void handleStatusUpdate(byte id) + { + if (id == 3) + { + for(int i = 0; i < 3; ++i) + { + this.world.spawnParticle(particleType, this.posX, this.posY, this.posZ, 0.0D, 0.0D, 0.0D, new int[0]); + } + } + + } + + protected void onImpact(RayTraceResult result) + { + boolean doit = true; + EntityLivingBase thrower = this.getThrower(); + + if (result.entityHit != null && result.entityHit != thrower) + { + result.entityHit.attackEntityFrom(DamageSource.causeThrownDamage(this, thrower), 0.0F); + } + + if (result.typeOfHit != RayTraceResult.Type.MISS) + { + BlockPos pos; + + if (result.typeOfHit == RayTraceResult.Type.BLOCK) + { + if (!DataSpiderAttackWeb.ConfigDataSpiderAttackWeb.instance.getSlingWebbingOnWeb()) + { + IBlockState state = this.world.getBlockState(result.getBlockPos()); + Block oldBlock = state.getBlock(); + doit &= oldBlock != Blocks.WEB; + } + + pos = result.getBlockPos().offset(result.sideHit); + } + else + { + pos = result.entityHit.getPosition(); + } + + doit &= this.getThrower() != result.entityHit; + + if (doit) + { + onHit(this.world, pos, thrower, result.entityHit); + } + } + + if (doit && !this.world.isRemote) + { + this.world.setEntityState(this, (byte)3); + this.setDead(); + } + + } + + public static EntityThrowableWeb sling(World worldIn, EntityLivingBase entityIn) + { + EntityThrowableWeb entity = null; + float pitch = 1.0F / (entityIn.getRNG().nextFloat() * 0.4F + 0.8F); + + entityIn.playSound(ObjectHandler.WEBBING_SHOOT, 1.0F, pitch); + + if (!worldIn.isRemote) + { + entity = new EntityThrowableWeb(worldIn, entityIn); + float inaccuracy = DataSpiderAttackWeb.ConfigDataSpiderAttackWeb.instance.getSlingInaccuracy(); + entity.shoot(entityIn, entityIn.rotationPitch, entityIn.rotationYaw, 0.0F, 1.1F, inaccuracy); + worldIn.spawnEntity(entity); + } + + return entity; + } + + public static void onHit(World world, BlockPos pos, Entity source, Entity target) + { + IBlockState state = world.getBlockState(pos); + Block oldBlock = state.getBlock(); + boolean stick = true; + + if (!oldBlock.isReplaceable(world, pos) || + !DataSpiderAttackWeb.ConfigDataSpiderAttackWeb.instance.getBlockWebReplacement() && !oldBlock.isAir(state, world, pos)) + { + stick = false; + } + + if (!stick) + { + world.playSound((EntityPlayer)null, pos, ObjectHandler.WEBBING_NONSTICK, + SoundCategory.NEUTRAL, 0.5F, 0.4F / (world.rand.nextFloat() * 0.4F + 0.8F)); + } + else + { + world.playSound((EntityPlayer)null, pos, ObjectHandler.WEBBING_STICK, + SoundCategory.NEUTRAL, 0.5F, 0.4F / (world.rand.nextFloat() * 0.4F + 0.8F)); + + if (!world.isRemote) + { + world.setBlockState(pos, Blocks.WEB.getDefaultState()); + + if (target != null) + { + target.setInWeb(); + + if (target instanceof EntityPlayerMP) + { + DynamicSpawnControl.networkWrapper.sendTo(new PlayerInWebMessage(pos), (EntityPlayerMP)target); + } + } + + } + } + } + + static + { + particleType = EnumParticleTypes.SNOWBALL; + } +} diff --git a/dynamicspawncontrol-1.12.2/src/main/java/org/imesense/dynamicspawncontrol/ai/spider/utils/attackweb/IWebSlinger.java b/dynamicspawncontrol-1.12.2/src/main/java/org/imesense/dynamicspawncontrol/ai/spider/utils/attackweb/IWebSlinger.java new file mode 100644 index 0000000..8f27678 --- /dev/null +++ b/dynamicspawncontrol-1.12.2/src/main/java/org/imesense/dynamicspawncontrol/ai/spider/utils/attackweb/IWebSlinger.java @@ -0,0 +1,17 @@ +package org.imesense.dynamicspawncontrol.ai.spider.utils.attackweb; + +import org.imesense.dynamicspawncontrol.technical.customlibrary.thing.IThing; + +/** + * + */ +@FunctionalInterface +public interface IWebSlinger +{ + /** + * + * @param var1 + * @param var2 + */ + void checkInit(IThing var1, int var2); +} diff --git a/dynamicspawncontrol-1.12.2/src/main/java/org/imesense/dynamicspawncontrol/ai/spider/utils/attackweb/WebSlingerCapability.java b/dynamicspawncontrol-1.12.2/src/main/java/org/imesense/dynamicspawncontrol/ai/spider/utils/attackweb/WebSlingerCapability.java new file mode 100644 index 0000000..156d2cd --- /dev/null +++ b/dynamicspawncontrol-1.12.2/src/main/java/org/imesense/dynamicspawncontrol/ai/spider/utils/attackweb/WebSlingerCapability.java @@ -0,0 +1,127 @@ +package org.imesense.dynamicspawncontrol.ai.spider.utils.attackweb; + +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLiving; +import net.minecraft.util.EnumFacing; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.common.capabilities.Capability; +import net.minecraftforge.common.capabilities.CapabilityInject; +import net.minecraftforge.common.capabilities.CapabilityManager; +import net.minecraftforge.event.entity.living.LivingAttackEvent; +import net.minecraftforge.fml.common.Mod; +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; +import org.imesense.dynamicspawncontrol.ai.spider.task.AISpiderWebAttackTask; +import org.imesense.dynamicspawncontrol.debug.CodeGenericUtils; +import org.imesense.dynamicspawncontrol.technical.config.spiderattackweb.DataSpiderAttackWeb; +import org.imesense.dynamicspawncontrol.technical.customlibrary.thing.EntityThing; +import org.imesense.dynamicspawncontrol.technical.customlibrary.thing.IThing; + +@Mod.EventBusSubscriber +public class WebSlingerCapability implements IWebSlinger +{ + @CapabilityInject(IWebSlinger.class) + public static final Capability CAPABILITY = null; + + public static final EnumFacing DEFAULT_FACING = null; + + public static final ResourceLocation ID = new ResourceLocation("dynamicspawncontrol", "webslinger"); + + IThing owner; + + public void checkInit(IThing ownerIn, int taskPriority) + { + if (this.owner != ownerIn) + { + this.owner = ownerIn; + this.initialize(taskPriority); + } + + } + + protected EntityLiving getOwner() + { + if (this.owner instanceof EntityThing) + { + EntityThing thing = (EntityThing) CodeGenericUtils.as(this.owner, EntityThing.class); + EntityLiving living = (EntityLiving)CodeGenericUtils.as(thing.owner, EntityLiving.class); + + return living; + } + else + { + return null; + } + } + + protected void initialize(int taskPriority) + { + if (DataSpiderAttackWeb.ConfigDataSpiderAttackWeb.instance.getSlingWebbing()) + { + EntityLiving living = this.getOwner(); + + if (living != null) + { + living.tasks.addTask(taskPriority, new AISpiderWebAttackTask(living)); + } + } + + } + + public static void register() + { + CapabilityManager.INSTANCE.register(IWebSlinger.class, new WebSlingerStorage(), () -> + { + return new WebSlingerCapability(); + }); + } + + WebSlingerCapability() + { + this.owner = null; + MinecraftForge.EVENT_BUS.register(this); + } + + WebSlingerCapability(IThing ownerIn, int taskPriority) + { + this(); + this.checkInit(ownerIn, taskPriority); + } + + @SubscribeEvent + public void onLivingAttack(LivingAttackEvent event) + { + Entity immediateSource = event.getSource().getImmediateSource(); + Entity trueSource = event.getSource().getTrueSource(); + Entity target = event.getEntity(); + EntityLiving myowner = this.getOwner(); + + if (immediateSource != null && myowner != null && immediateSource == myowner && immediateSource == trueSource) + { + tryAttack(immediateSource, trueSource, target); + } + + } + + protected static void tryAttack(Entity immediateSource, Entity source, Entity target) + { + World world = target.world; + + if (!(DataSpiderAttackWeb.ConfigDataSpiderAttackWeb.instance.getWebMeleeChance() <= world.rand.nextDouble())) + { + if (target != null && immediateSource != null) + { + double distance = immediateSource.getDistanceSq(target); + if (distance > 2.0D) + { + return; + } + } + + BlockPos pos = new BlockPos(target.posX, target.posY, target.posZ); + EntityThrowableWeb.onHit(world, pos, source, target); + } + } +} diff --git a/dynamicspawncontrol-1.12.2/src/main/java/org/imesense/dynamicspawncontrol/ai/spider/utils/attackweb/WebSlingerProvider.java b/dynamicspawncontrol-1.12.2/src/main/java/org/imesense/dynamicspawncontrol/ai/spider/utils/attackweb/WebSlingerProvider.java new file mode 100644 index 0000000..ce7b427 --- /dev/null +++ b/dynamicspawncontrol-1.12.2/src/main/java/org/imesense/dynamicspawncontrol/ai/spider/utils/attackweb/WebSlingerProvider.java @@ -0,0 +1,35 @@ +package org.imesense.dynamicspawncontrol.ai.spider.utils.attackweb; + +import net.minecraft.util.EnumFacing; +import net.minecraftforge.common.capabilities.Capability; +import org.imesense.dynamicspawncontrol.technical.customlibrary.SimpleCapabilityProvider; +import org.imesense.dynamicspawncontrol.technical.customlibrary.thing.IThing; + +import javax.annotation.Nullable; + +public class WebSlingerProvider extends SimpleCapabilityProvider +{ + IThing owner = null; + int taskPriority = -1; + + public WebSlingerProvider(Capability capability, @Nullable EnumFacing facing, IThing ownerIn, int taskPriorityIn) + { + super(capability, facing, capability != null ? (IWebSlinger)capability.getDefaultInstance() : null); + this.owner = ownerIn; + this.taskPriority = taskPriorityIn; + } + + public WebSlingerProvider(Capability capability, @Nullable EnumFacing facing, IWebSlinger instance, IThing ownerIn, int taskPriorityIn) + { + super(capability, facing, instance); + this.owner = ownerIn; + this.taskPriority = taskPriorityIn; + } + + public final IWebSlinger getInstance() + { + IWebSlinger cap = (IWebSlinger)super.getInstance(); + cap.checkInit(this.owner, this.taskPriority); + return cap; + } +} diff --git a/dynamicspawncontrol-1.12.2/src/main/java/org/imesense/dynamicspawncontrol/ai/spider/utils/attackweb/WebSlingerStorage.java b/dynamicspawncontrol-1.12.2/src/main/java/org/imesense/dynamicspawncontrol/ai/spider/utils/attackweb/WebSlingerStorage.java new file mode 100644 index 0000000..b501b25 --- /dev/null +++ b/dynamicspawncontrol-1.12.2/src/main/java/org/imesense/dynamicspawncontrol/ai/spider/utils/attackweb/WebSlingerStorage.java @@ -0,0 +1,33 @@ +package org.imesense.dynamicspawncontrol.ai.spider.utils.attackweb; + +import net.minecraft.nbt.NBTBase; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.EnumFacing; +import net.minecraftforge.common.capabilities.Capability; +import net.minecraftforge.common.capabilities.Capability.IStorage; + +public class WebSlingerStorage implements IStorage +{ + public NBTBase writeNBT(Capability capability, IWebSlinger instance, EnumFacing side) + { + NBTTagCompound tags = new NBTTagCompound(); + + if (instance != null) + { + + } + + return tags; + } + + public void readNBT(Capability capability, IWebSlinger instance, EnumFacing side, NBTBase nbt) + { + NBTTagCompound tags = (NBTTagCompound)nbt; + + if (tags != null && instance != null) + { + + } + } +} + diff --git a/dynamicspawncontrol-1.12.2/src/main/java/org/imesense/dynamicspawncontrol/ai/spider/utils/event/EventHandler.java b/dynamicspawncontrol-1.12.2/src/main/java/org/imesense/dynamicspawncontrol/ai/spider/utils/event/EventHandler.java new file mode 100644 index 0000000..7fced92 --- /dev/null +++ b/dynamicspawncontrol-1.12.2/src/main/java/org/imesense/dynamicspawncontrol/ai/spider/utils/event/EventHandler.java @@ -0,0 +1,73 @@ +package org.imesense.dynamicspawncontrol.ai.spider.utils.event; + +import net.minecraft.entity.Entity; +import net.minecraft.entity.monster.EntitySpider; +import net.minecraft.tileentity.TileEntity; +import net.minecraftforge.event.AttachCapabilitiesEvent; +import net.minecraftforge.fml.common.Mod; +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; +import org.imesense.dynamicspawncontrol.ai.spider.utils.attackweb.WebSlingerCapability; +import org.imesense.dynamicspawncontrol.ai.spider.utils.attackweb.WebSlingerProvider; +import org.imesense.dynamicspawncontrol.technical.customlibrary.thing.EntityThing; +import org.imesense.dynamicspawncontrol.technical.customlibrary.thing.TileEntityThing; + +@Mod.EventBusSubscriber +public class EventHandler +{ + @SubscribeEvent + public static void attachCapabilitiesTileEntity(AttachCapabilitiesEvent event) + { + TileEntity entity = (TileEntity)event.getObject(); + + int priority = getEntityPriority(entity); + + if (doesIt(priority)) + { + WebSlingerProvider provider = new WebSlingerProvider( + WebSlingerCapability.CAPABILITY, + WebSlingerCapability.DEFAULT_FACING, + new TileEntityThing(entity), + priority + ); + + event.addCapability(WebSlingerCapability.ID, provider); + } + } + + @SubscribeEvent + public static void attachCapabilitiesEntity(AttachCapabilitiesEvent event) + { + Entity entity = (Entity)event.getObject(); + + int priority = getEntityPriority(entity); + + if (doesIt(priority)) + { + WebSlingerProvider provider = new WebSlingerProvider( + WebSlingerCapability.CAPABILITY, + WebSlingerCapability.DEFAULT_FACING, + new EntityThing(entity), + priority + ); + + event.addCapability(WebSlingerCapability.ID, provider); + } + } + + private static int getEntityPriority(Object entity) + { + if (entity instanceof EntitySpider) + { + return 3; + } + else + { + return -1; + } + } + + private static boolean doesIt(int priority) + { + return priority > 0; + } +} diff --git a/dynamicspawncontrol-1.12.2/src/main/java/org/imesense/dynamicspawncontrol/debug/CodeGenericUtils.java b/dynamicspawncontrol-1.12.2/src/main/java/org/imesense/dynamicspawncontrol/debug/CodeGenericUtils.java index a8b2698..278682e 100644 --- a/dynamicspawncontrol-1.12.2/src/main/java/org/imesense/dynamicspawncontrol/debug/CodeGenericUtils.java +++ b/dynamicspawncontrol-1.12.2/src/main/java/org/imesense/dynamicspawncontrol/debug/CodeGenericUtils.java @@ -1,11 +1,18 @@ package org.imesense.dynamicspawncontrol.debug; import com.google.gson.JsonElement; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.EnumFacing; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; +import net.minecraftforge.common.capabilities.Capability; +import net.minecraftforge.common.capabilities.ICapabilityProvider; import org.imesense.dynamicspawncontrol.technical.attributefactory.AttributeKey; import org.imesense.dynamicspawncontrol.technical.attributefactory.AttributeMap; import org.imesense.dynamicspawncontrol.technical.customlibrary.Log; import org.imesense.dynamicspawncontrol.technical.parsers.ParserGenericJsonScripts; +import javax.annotation.Nullable; import java.util.List; import java.util.function.Function; @@ -119,4 +126,50 @@ public static void printInitClassToLog(final Class getClass) { Log.writeDataToLogFile(0, String.format("Initializing a class: {%s}", getClass.getName())); } + + /** + * + * @param getObject + * @param getClass + * @return + * @param + */ + public static T as(Object getObject, Class getClass) + { + return getClass.isInstance(getObject) ? getClass.cast(getObject) : null; + } + + /** + * + * @param provider + * @param capability + * @param facing + * @return + * @param + */ + @Nullable + public static T fetchCapability(@Nullable ICapabilityProvider provider, Capability capability, @Nullable EnumFacing facing) + { + return provider != null && provider.hasCapability(capability, facing) ? provider.getCapability(capability, facing) : null; + } + + /** + * + * @param worldIn + * @param pos + * @param capability + * @param facing + * @return + * @param + */ + @Nullable + public static T fetchCapability(World worldIn, BlockPos pos, Capability capability, @Nullable EnumFacing facing) + { + TileEntity tileentity = worldIn.getTileEntity(pos); + return fetchCapability(tileentity, capability, facing); + } + + public static T getValueOrDefault(T value, T defaultValue) { + return value == null ? defaultValue : value; + } } diff --git a/dynamicspawncontrol-1.12.2/src/main/java/org/imesense/dynamicspawncontrol/gameplay/items/DSCWeb.java b/dynamicspawncontrol-1.12.2/src/main/java/org/imesense/dynamicspawncontrol/gameplay/items/DSCWeb.java new file mode 100644 index 0000000..2b49529 --- /dev/null +++ b/dynamicspawncontrol-1.12.2/src/main/java/org/imesense/dynamicspawncontrol/gameplay/items/DSCWeb.java @@ -0,0 +1,38 @@ +package org.imesense.dynamicspawncontrol.gameplay.items; + +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.stats.StatList; +import net.minecraft.util.ActionResult; +import net.minecraft.util.EnumActionResult; +import net.minecraft.util.EnumHand; +import net.minecraft.world.World; +import org.imesense.dynamicspawncontrol.ai.spider.utils.attackweb.EntityThrowableWeb; +import org.imesense.dynamicspawncontrol.technical.customlibrary.ObjectHandler; + +public class DSCWeb extends Item +{ + public DSCWeb() + { + this.maxStackSize = 1; + this.setCreativeTab(CreativeTabs.MISC); + ObjectHandler.RegistrationHandler.nameHelper(this, "dynamicspawncontrol:webbing"); + } + + public ActionResult onItemRightClick(World worldIn, EntityPlayer playerIn, EnumHand handIn) + { + ItemStack itemstack = playerIn.getHeldItem(handIn); + + if (!playerIn.capabilities.isCreativeMode) + { + itemstack.shrink(1); + } + + EntityThrowableWeb.sling(worldIn, playerIn); + playerIn.addStat(StatList.getObjectUseStats(this)); + + return new ActionResult(EnumActionResult.SUCCESS, itemstack); + } +} diff --git a/dynamicspawncontrol-1.12.2/src/main/java/org/imesense/dynamicspawncontrol/gameplay/recipes/CraftItemWeb.java b/dynamicspawncontrol-1.12.2/src/main/java/org/imesense/dynamicspawncontrol/gameplay/recipes/CraftItemWeb.java new file mode 100644 index 0000000..18d34a9 --- /dev/null +++ b/dynamicspawncontrol-1.12.2/src/main/java/org/imesense/dynamicspawncontrol/gameplay/recipes/CraftItemWeb.java @@ -0,0 +1,22 @@ +package org.imesense.dynamicspawncontrol.gameplay.recipes; + +import net.minecraft.init.Items; +import net.minecraft.item.ItemStack; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.fml.common.registry.GameRegistry; +import org.imesense.dynamicspawncontrol.technical.customlibrary.ObjectHandler; + +public class CraftItemWeb implements IRecipes +{ + @Override + public void registry() + { + GameRegistry.addShapedRecipe(new ResourceLocation("dynamicspawncontrol", "webbing"), null, + new ItemStack(ObjectHandler.webbing), + "SSS", + "SWS", + "SSS", + 'S', Items.STRING, + 'W', Items.SLIME_BALL); + } +} diff --git a/dynamicspawncontrol-1.12.2/src/main/java/org/imesense/dynamicspawncontrol/gameplay/recipes/IRecipes.java b/dynamicspawncontrol-1.12.2/src/main/java/org/imesense/dynamicspawncontrol/gameplay/recipes/IRecipes.java new file mode 100644 index 0000000..8aff1e4 --- /dev/null +++ b/dynamicspawncontrol-1.12.2/src/main/java/org/imesense/dynamicspawncontrol/gameplay/recipes/IRecipes.java @@ -0,0 +1,7 @@ +package org.imesense.dynamicspawncontrol.gameplay.recipes; + +@FunctionalInterface +public interface IRecipes +{ + void registry(); +} diff --git a/dynamicspawncontrol-1.12.2/src/main/java/org/imesense/dynamicspawncontrol/technical/customlibrary/ObjectHandler.java b/dynamicspawncontrol-1.12.2/src/main/java/org/imesense/dynamicspawncontrol/technical/customlibrary/ObjectHandler.java new file mode 100644 index 0000000..69db463 --- /dev/null +++ b/dynamicspawncontrol-1.12.2/src/main/java/org/imesense/dynamicspawncontrol/technical/customlibrary/ObjectHandler.java @@ -0,0 +1,82 @@ +package org.imesense.dynamicspawncontrol.technical.customlibrary; + + +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.entity.RenderSnowball; +import net.minecraft.init.SoundEvents; +import net.minecraft.item.Item; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.SoundEvent; +import net.minecraftforge.client.event.ModelRegistryEvent; +import net.minecraftforge.event.RegistryEvent.Register; +import net.minecraftforge.fml.client.registry.RenderingRegistry; +import net.minecraftforge.fml.common.Mod; +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; +import net.minecraftforge.fml.common.registry.EntityEntry; +import net.minecraftforge.fml.common.registry.EntityEntryBuilder; +import net.minecraftforge.fml.common.registry.GameRegistry; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; +import net.minecraftforge.registries.IForgeRegistry; +import org.imesense.dynamicspawncontrol.ai.spider.utils.attackweb.EntityThrowableWeb; +import org.imesense.dynamicspawncontrol.gameplay.items.DSCWeb; +import org.imesense.dynamicspawncontrol.technical.customlibrary.registrationhelpers.RegistrationHelpers; + +@GameRegistry.ObjectHolder("dynamicspawncontrol") +public class ObjectHandler +{ + private static int entityID = 1; + public static Item webbing = null; + public static SoundEvent WEBBING_SHOOT; + public static SoundEvent WEBBING_STICK; + public static SoundEvent WEBBING_NONSTICK; + + @Mod.EventBusSubscriber( + modid = "dynamicspawncontrol" + ) + public static class RegistrationHandler extends RegistrationHelpers + { + @SubscribeEvent + public static void registerItems(Register event) + { + IForgeRegistry registry = event.getRegistry(); + ObjectHandler.webbing = (Item)regHelper(registry, new DSCWeb()); + } + + @SubscribeEvent + @SideOnly(Side.CLIENT) + public static void registerRenders(ModelRegistryEvent event) + { + registerRender(ObjectHandler.webbing); + + RenderingRegistry.registerEntityRenderingHandler(EntityThrowableWeb.class, (manager) -> + { + return new RenderSnowball(manager, ObjectHandler.webbing, Minecraft.getMinecraft().getRenderItem()); + }); + } + + @SubscribeEvent + public static void entityRegistration(Register event) + { + registerEntity(event.getRegistry()); + } + + protected static void registerEntity(IForgeRegistry registry) + { + EntityEntry entry = + EntityEntryBuilder.create().entity(EntityThrowableWeb.class).id( + new ResourceLocation("dynamicspawncontrol", "webbing"), + ObjectHandler.entityID++).name("webbing").tracker(64, 10, true).build(); + + registry.register(entry); + } + + @SubscribeEvent + public static void soundRegistration(Register event) + { + ObjectHandler.WEBBING_SHOOT = SoundEvents.ENTITY_SNOWBALL_THROW; + ObjectHandler.WEBBING_STICK = SoundEvents.BLOCK_SNOW_HIT; + ObjectHandler.WEBBING_NONSTICK = SoundEvents.BLOCK_SNOW_BREAK; + } + } +} diff --git a/dynamicspawncontrol-1.12.2/src/main/java/org/imesense/dynamicspawncontrol/technical/customlibrary/SimpleCapabilityProvider.java b/dynamicspawncontrol-1.12.2/src/main/java/org/imesense/dynamicspawncontrol/technical/customlibrary/SimpleCapabilityProvider.java new file mode 100644 index 0000000..7e914f6 --- /dev/null +++ b/dynamicspawncontrol-1.12.2/src/main/java/org/imesense/dynamicspawncontrol/technical/customlibrary/SimpleCapabilityProvider.java @@ -0,0 +1,74 @@ +package org.imesense.dynamicspawncontrol.technical.customlibrary; + +import javax.annotation.Nullable; +import net.minecraft.nbt.NBTBase; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.EnumFacing; +import net.minecraftforge.common.capabilities.Capability; +import net.minecraftforge.common.capabilities.ICapabilitySerializable; + +public class SimpleCapabilityProvider implements ICapabilitySerializable +{ + private final Capability capability; + private final EnumFacing facing; + private final HANDLER instance; + + public SimpleCapabilityProvider() + { + this.capability = null; + this.facing = null; + this.instance = null; + } + + public SimpleCapabilityProvider(Capability capability, @Nullable EnumFacing facing) + { + this(capability, facing, capability != null ? capability.getDefaultInstance() : null); + } + + public SimpleCapabilityProvider(Capability capability, @Nullable EnumFacing facing, HANDLER instance) + { + this.capability = capability; + this.instance = instance; + this.facing = facing; + } + + public boolean hasCapability(Capability capability, @Nullable EnumFacing facing) + { + return capability != null && capability == this.getCapability(); + } + + @Nullable + public T getCapability(Capability capability, @Nullable EnumFacing facing) + { + return this.hasCapability(capability, facing) ? this.getCapability().cast(this.getInstance()) : null; + } + + public NBTBase serializeNBT() + { + return (NBTBase)(this.getCapability() == null ? new NBTTagCompound() : this.getCapability().writeNBT(this.getInstance(), this.getFacing())); + } + + public void deserializeNBT(NBTBase nbt) + { + if (this.getCapability() != null) + { + this.getCapability().readNBT(this.getInstance(), this.getFacing(), nbt); + } + } + + public final Capability getCapability() + { + return this.capability; + } + + @Nullable + public EnumFacing getFacing() + { + return this.facing; + } + + public HANDLER getInstance() + { + return this.instance; + } +} diff --git a/dynamicspawncontrol-1.12.2/src/main/java/org/imesense/dynamicspawncontrol/technical/customlibrary/registrationhelpers/IProcedure.java b/dynamicspawncontrol-1.12.2/src/main/java/org/imesense/dynamicspawncontrol/technical/customlibrary/registrationhelpers/IProcedure.java new file mode 100644 index 0000000..376703c --- /dev/null +++ b/dynamicspawncontrol-1.12.2/src/main/java/org/imesense/dynamicspawncontrol/technical/customlibrary/registrationhelpers/IProcedure.java @@ -0,0 +1,25 @@ +package org.imesense.dynamicspawncontrol.technical.customlibrary.registrationhelpers; + +@FunctionalInterface +public interface IProcedure +{ + void run(); + + default IProcedure andThen(IProcedure after) + { + return () -> + { + this.run(); + after.run(); + }; + } + + default IProcedure compose(IProcedure before) + { + return () -> + { + before.run(); + this.run(); + }; + } +} diff --git a/dynamicspawncontrol-1.12.2/src/main/java/org/imesense/dynamicspawncontrol/technical/customlibrary/registrationhelpers/RegistrationHelpers.java b/dynamicspawncontrol-1.12.2/src/main/java/org/imesense/dynamicspawncontrol/technical/customlibrary/registrationhelpers/RegistrationHelpers.java new file mode 100644 index 0000000..a9b7410 --- /dev/null +++ b/dynamicspawncontrol-1.12.2/src/main/java/org/imesense/dynamicspawncontrol/technical/customlibrary/registrationhelpers/RegistrationHelpers.java @@ -0,0 +1,256 @@ +package org.imesense.dynamicspawncontrol.technical.customlibrary.registrationhelpers; + +import net.minecraft.block.Block; +import net.minecraft.client.renderer.block.model.ModelResourceLocation; +import net.minecraft.item.Item; +import net.minecraft.item.ItemBlock; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.SoundEvent; +import net.minecraftforge.client.model.ModelLoader; +import net.minecraftforge.fml.common.Loader; +import net.minecraftforge.fml.common.ModContainer; +import net.minecraftforge.fml.common.registry.GameRegistry; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; +import net.minecraftforge.oredict.OreDictionary; +import net.minecraftforge.registries.GameData; +import net.minecraftforge.registries.IForgeRegistry; +import net.minecraftforge.registries.IForgeRegistryEntry; + +public class RegistrationHelpers +{ + public static void run(IProcedure proc) + { + proc.run(); + } + + public static void cheat(IProcedure proc) + { + Loader l = Loader.instance(); + ModContainer k = l.activeModContainer(); + l.setActiveModContainer(l.getMinecraftModContainer()); + proc.run(); + l.setActiveModContainer(k); + } + + public static void setRegNameIllegally(IForgeRegistryEntry entry, String name) + { + cheat(() -> + { + entry.setRegistryName(new ResourceLocation("minecraft", name)); + }); + } + + public static > T regHelper(IForgeRegistry registry, T thing) + { + assert thing != null; + + registry.register(thing); + return thing; + } + + public static Item registerOreNames(Item thing, String[] oreNames) + { + assert thing != null; + + String[] var2 = oreNames; + int var3 = oreNames.length; + + for(int var4 = 0; var4 < var3; ++var4) + { + String oreName = var2[var4]; + OreDictionary.registerOre(oreName, thing); + } + + return thing; + } + + public static ItemStack registerOreNames(ItemStack thing, String[] oreNames) + { + assert thing != null; + + String[] var2 = oreNames; + int var3 = oreNames.length; + + for(int var4 = 0; var4 < var3; ++var4) + { + String oreName = var2[var4]; + OreDictionary.registerOre(oreName, thing); + } + + return thing; + } + + public static Item regHelperOre(IForgeRegistry registry, Item thing, String[] oreNames) + { + assert thing != null; + + registry.register(thing); + return registerOreNames(thing, oreNames); + } + + public static > T regHelper(IForgeRegistry registry, T thing, String name) + { + return regHelper(registry, thing, name, true); + } + + public static > T regHelper(IForgeRegistry registry, T thing, String name, boolean doTransKey, boolean shouldCheat) + { + assert thing != null; + + assert name != null; + + IProcedure nameIt = () -> + { + nameHelper(thing, name, doTransKey); + }; + + if (shouldCheat) + { + cheat(nameIt); + } + else + { + run(nameIt); + } + + return regHelper(registry, thing); + } + + public static > T regHelper(IForgeRegistry registry, T thing, String name, boolean doTransKey) + { + return regHelper(registry, thing, name, doTransKey, false); + } + + public static > T regHelper(IForgeRegistry registry, T thing, ResourceLocation loc) + { + assert thing != null; + + assert loc != null; + + nameHelper(thing, loc, true); + return regHelper(registry, thing); + } + + public static > void nameHelper(T thing, ResourceLocation loc, boolean doTransKey) + { + assert thing != null; + + assert loc != null; + + thing.setRegistryName(loc); + + if (doTransKey) + { + String dotname = loc.getResourceDomain() + "." + loc.getResourcePath(); + + if (thing instanceof Block) + { + ((Block)thing).setUnlocalizedName(dotname); + } + else if (thing instanceof Item) + { + ((Item)thing).setUnlocalizedName(dotname); + } + } + } + + public static > void nameHelper(T thing, ResourceLocation loc) + { + nameHelper(thing, loc, true); + } + + public static > void nameHelper(T thing, String name, boolean doTransKey) + { + assert thing != null; + + assert name != null; + + ResourceLocation loc = GameData.checkPrefix(name); + nameHelper(thing, loc, doTransKey); + } + + public static > void nameHelper(T thing, String name) + { + nameHelper(thing, name, true); + } + + public static SoundEvent registerSound(IForgeRegistry registry, String name) + { + assert name != null; + + ResourceLocation loc = GameData.checkPrefix(name); + SoundEvent event = new SoundEvent(loc); + regHelper(registry, event, (ResourceLocation)loc); + return event; + } + + @SideOnly(Side.CLIENT) + public static void registerRender(Item item) + { + assert item != null; + + ModelResourceLocation loc = new ModelResourceLocation(item.getRegistryName(), "inventory"); + ModelLoader.setCustomModelResourceLocation(item, 0, loc); + } + + @SideOnly(Side.CLIENT) + public static void registerRender(Block block) + { + assert block != null; + + Item item = Item.getItemFromBlock(block); + registerRender(block, item); + } + + @SideOnly(Side.CLIENT) + public static void registerRender(Block block, Item item) + { + assert block != null; + + assert item != null; + + ModelResourceLocation loc = new ModelResourceLocation(item.getRegistryName(), "inventory"); + ModelLoader.setCustomModelResourceLocation(item, 0, loc); + } + + public static ItemBlock registerItemBlock(IForgeRegistry registry, Block block) + { + assert block != null; + + ItemBlock item = new ItemBlock(block); + regHelper(registry, item, (ResourceLocation)block.getRegistryName()); + return item; + } + + public static ItemBlock registerItemBlockOre(IForgeRegistry registry, Block block, String[] oreNames) + { + assert block != null; + + ItemBlock item = registerItemBlock(registry, block); + String[] var4 = oreNames; + int var5 = oreNames.length; + + for(int var6 = 0; var6 < var5; ++var6) + { + String oreName = var4[var6]; + OreDictionary.registerOre(oreName, item); + OreDictionary.registerOre(oreName, block); + } + + return item; + } + + public static void registerTileEntity(Class tileEntityClass, String key) + { + assert key != null; + + ResourceLocation loc = GameData.checkPrefix(key); + + assert loc != null; + + GameRegistry.registerTileEntity(tileEntityClass, loc); + } +} \ No newline at end of file diff --git a/dynamicspawncontrol-1.12.2/src/main/java/org/imesense/dynamicspawncontrol/technical/customlibrary/thing/EntityThing.java b/dynamicspawncontrol-1.12.2/src/main/java/org/imesense/dynamicspawncontrol/technical/customlibrary/thing/EntityThing.java new file mode 100644 index 0000000..a4e819a --- /dev/null +++ b/dynamicspawncontrol-1.12.2/src/main/java/org/imesense/dynamicspawncontrol/technical/customlibrary/thing/EntityThing.java @@ -0,0 +1,18 @@ +package org.imesense.dynamicspawncontrol.technical.customlibrary.thing; + +import net.minecraft.entity.Entity; +//import org.imesense.dynamicspawncontrol.technical.config.spiderattackweb.MatchingConfig; + +import java.util.ArrayList; + +public class EntityThing extends EntityThingBase implements IThing +{ + public EntityThing(Entity entity) + { + super(entity); + } + + //public ArrayList getNameKeys() { + // return MatchingConfig.getNameKeys(this.owner); + //} +} diff --git a/dynamicspawncontrol-1.12.2/src/main/java/org/imesense/dynamicspawncontrol/technical/customlibrary/thing/EntityThingBase.java b/dynamicspawncontrol-1.12.2/src/main/java/org/imesense/dynamicspawncontrol/technical/customlibrary/thing/EntityThingBase.java new file mode 100644 index 0000000..0e34e37 --- /dev/null +++ b/dynamicspawncontrol-1.12.2/src/main/java/org/imesense/dynamicspawncontrol/technical/customlibrary/thing/EntityThingBase.java @@ -0,0 +1,77 @@ +package org.imesense.dynamicspawncontrol.technical.customlibrary.thing; + +import net.minecraft.entity.Entity; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; +import net.minecraftforge.common.capabilities.ICapabilityProvider; + +public class EntityThingBase implements IThingBase +{ + public Entity owner; + + public EntityThingBase(Entity ownerIn) + { + this.owner = ownerIn; + } + + public World getWorld() + { + return this.owner != null ? this.owner.getEntityWorld() : null; + } + + public BlockPos getPos() + { + return this.owner != null ? this.owner.getPosition() : null; + } + + public boolean isInvalid() + { + return this.owner == null || this.owner.isDead; + } + + public void markDirty() + { + + } + + public void invalidate() + { + if (this.owner != null) + { + this.owner.setDead(); + } + + this.owner = null; + } + + public boolean sameAs(IThing entity) + { + if (entity instanceof EntityThingBase) + { + return this.owner == ((EntityThingBase)entity).owner; + } + else + { + return false; + } + } + + public Object object() + { + return this.owner; + } + + public ICapabilityProvider capProvider() + { + return this.owner; + } + + public void forceUpdate() + { + if (this.owner != null) + { + BlockPos pos = this.getPos(); + this.owner.setPositionAndUpdate((double)pos.getX(), (double)pos.getY(), (double)pos.getZ()); + } + } +} diff --git a/dynamicspawncontrol-1.12.2/src/main/java/org/imesense/dynamicspawncontrol/technical/customlibrary/thing/IThing.java b/dynamicspawncontrol-1.12.2/src/main/java/org/imesense/dynamicspawncontrol/technical/customlibrary/thing/IThing.java new file mode 100644 index 0000000..4140f87 --- /dev/null +++ b/dynamicspawncontrol-1.12.2/src/main/java/org/imesense/dynamicspawncontrol/technical/customlibrary/thing/IThing.java @@ -0,0 +1,8 @@ +package org.imesense.dynamicspawncontrol.technical.customlibrary.thing; + +import java.util.ArrayList; + +public interface IThing extends IThingBase +{ + //ArrayList getNameKeys(); +} diff --git a/dynamicspawncontrol-1.12.2/src/main/java/org/imesense/dynamicspawncontrol/technical/customlibrary/thing/IThingBase.java b/dynamicspawncontrol-1.12.2/src/main/java/org/imesense/dynamicspawncontrol/technical/customlibrary/thing/IThingBase.java new file mode 100644 index 0000000..0e4a1f2 --- /dev/null +++ b/dynamicspawncontrol-1.12.2/src/main/java/org/imesense/dynamicspawncontrol/technical/customlibrary/thing/IThingBase.java @@ -0,0 +1,74 @@ +package org.imesense.dynamicspawncontrol.technical.customlibrary.thing; + +//import com.wumple.util.base.misc.Util; +//import com.wumple.util.capability.CapabilityUtils; +import javax.annotation.Nonnull; +import javax.annotation.Nullable; +import net.minecraft.util.EnumFacing; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; +import net.minecraftforge.common.capabilities.Capability; +import net.minecraftforge.common.capabilities.ICapabilityProvider; +import org.imesense.dynamicspawncontrol.debug.CodeGenericUtils; + +public interface IThingBase extends ICapabilityProvider +{ + World getWorld(); + + BlockPos getPos(); + + boolean isInvalid(); + + void markDirty(); + + void invalidate(); + + boolean sameAs(IThing var1); + + Object object(); + + default World getWorldBackup(World otherWorld) + { + World myWorld = this.getWorld(); + return myWorld != null ? myWorld : otherWorld; + } + + default int getCount() + { + return 1; + } + + default T as(Class t) + { + return CodeGenericUtils.as(this.object(), t); + } + + default boolean is(Class t) + { + return t.isInstance(this.object()); + } + + ICapabilityProvider capProvider(); + + default boolean hasCapability(@Nonnull Capability capability, @Nullable EnumFacing facing) + { + ICapabilityProvider provider = this.capProvider(); + return provider != null ? provider.hasCapability(capability, facing) : false; + } + + @Nullable + default T getCapability(@Nonnull Capability capability, @Nullable EnumFacing facing) + { + ICapabilityProvider provider = this.capProvider(); + return provider != null ? provider.getCapability(capability, facing) : null; + } + + @Nullable + default T fetchCapability(@Nonnull Capability capability, @Nullable EnumFacing facing) + { + ICapabilityProvider provider = this.capProvider(); + return CodeGenericUtils.fetchCapability(provider, capability, facing); + } + + void forceUpdate(); +} diff --git a/dynamicspawncontrol-1.12.2/src/main/java/org/imesense/dynamicspawncontrol/technical/customlibrary/thing/TileEntityThing.java b/dynamicspawncontrol-1.12.2/src/main/java/org/imesense/dynamicspawncontrol/technical/customlibrary/thing/TileEntityThing.java new file mode 100644 index 0000000..9f03a0f --- /dev/null +++ b/dynamicspawncontrol-1.12.2/src/main/java/org/imesense/dynamicspawncontrol/technical/customlibrary/thing/TileEntityThing.java @@ -0,0 +1,16 @@ +package org.imesense.dynamicspawncontrol.technical.customlibrary.thing; + +import java.util.ArrayList; +import net.minecraft.tileentity.TileEntity; +//import org.imesense.dynamicspawncontrol.technical.config.spiderattackweb.MatchingConfig; + +public class TileEntityThing extends TileEntityThingBase implements IThing +{ + public TileEntityThing(TileEntity ownerIn) { + super(ownerIn); + } + + // public ArrayList getNameKeys() { + // return MatchingConfig.getNameKeys(this.owner); + //} +} diff --git a/dynamicspawncontrol-1.12.2/src/main/java/org/imesense/dynamicspawncontrol/technical/customlibrary/thing/TileEntityThingBase.java b/dynamicspawncontrol-1.12.2/src/main/java/org/imesense/dynamicspawncontrol/technical/customlibrary/thing/TileEntityThingBase.java new file mode 100644 index 0000000..bc5271f --- /dev/null +++ b/dynamicspawncontrol-1.12.2/src/main/java/org/imesense/dynamicspawncontrol/technical/customlibrary/thing/TileEntityThingBase.java @@ -0,0 +1,101 @@ +package org.imesense.dynamicspawncontrol.technical.customlibrary.thing; + +import net.minecraft.block.state.IBlockState; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; +import net.minecraftforge.common.capabilities.ICapabilityProvider; + +public class TileEntityThingBase implements IThingBase { + public TileEntity owner = null; + + public TileEntityThingBase(TileEntity ownerIn) + { + this.owner = ownerIn; + } + + public World getWorld() + { + return this.owner != null ? this.owner.getWorld() : null; + } + + public BlockPos getPos() + { + return this.owner != null ? this.owner.getPos() : null; + } + + public boolean isInvalid() + { + return this.owner == null || this.owner.isInvalid(); + } + + public void markDirty() + { + if (this.owner != null) + { + this.owner.markDirty(); + } + + } + + public void invalidate() + { + if (this.owner != null) + { + World world = this.getWorld(); + BlockPos pos = this.getPos(); + + if (world != null && pos != null) + { + world.setBlockToAir(pos); + world.removeTileEntity(pos); + } + + this.owner.invalidate(); + this.owner.updateContainingBlockInfo(); + } + + this.owner = null; + } + + public boolean sameAs(IThing entity) + { + if (entity instanceof TileEntityThingBase) + { + return this.owner == ((TileEntityThingBase)entity).owner; + } + else + { + return false; + } + } + + public Object object() + { + return this.owner; + } + + public ICapabilityProvider capProvider() + { + return this.owner; + } + + public void forceUpdate() + { + if (this.owner != null) + { + BlockPos pos = this.getPos(); + World world = this.getWorld(); + + if (world != null && pos != null) + { + IBlockState state = world.getBlockState(pos); + world.markBlockRangeForRenderUpdate(pos, pos); + world.notifyBlockUpdate(pos, state, state, 3); + world.scheduleBlockUpdate(pos, this.owner.getBlockType(), 0, 0); + } + + this.owner.markDirty(); + } + } +} diff --git a/dynamicspawncontrol-1.12.2/src/main/java/org/imesense/dynamicspawncontrol/technical/network/PlayerInWebMessage.java b/dynamicspawncontrol-1.12.2/src/main/java/org/imesense/dynamicspawncontrol/technical/network/PlayerInWebMessage.java new file mode 100644 index 0000000..4184e9b --- /dev/null +++ b/dynamicspawncontrol-1.12.2/src/main/java/org/imesense/dynamicspawncontrol/technical/network/PlayerInWebMessage.java @@ -0,0 +1,62 @@ +package org.imesense.dynamicspawncontrol.technical.network; + +import io.netty.buffer.ByteBuf; +import net.minecraft.client.Minecraft; +import net.minecraft.init.Blocks; +import net.minecraft.util.math.BlockPos; +import net.minecraftforge.fml.common.network.simpleimpl.IMessage; +import net.minecraftforge.fml.common.network.simpleimpl.IMessageHandler; +import net.minecraftforge.fml.common.network.simpleimpl.MessageContext; +import net.minecraftforge.fml.common.network.simpleimpl.SimpleNetworkWrapper; +import net.minecraftforge.fml.relauncher.Side; + +public class PlayerInWebMessage implements IMessage +{ + public BlockPos pos; + + public PlayerInWebMessage() + { + + } + + public PlayerInWebMessage(BlockPos pos) + { + this.pos = pos; + } + + public void fromBytes(ByteBuf buf) + { + this.pos = new BlockPos(buf.readInt(), buf.readInt(), buf.readInt()); + } + + public void toBytes(ByteBuf buf) + { + buf.writeInt(this.pos.getX()); + buf.writeInt(this.pos.getY()); + buf.writeInt(this.pos.getZ()); + } + + public static void register(SimpleNetworkWrapper netWrapper) + { + netWrapper.registerMessage(PlayerInWebMessage.Handler.class, PlayerInWebMessage.class, 0, Side.CLIENT); + } + + public static class Handler implements IMessageHandler + { + public IMessage onMessage(final PlayerInWebMessage msg, MessageContext ctx) + { + final Minecraft mc = Minecraft.getMinecraft(); + + mc.addScheduledTask(new Runnable() + { + public void run() + { + mc.world.setBlockState(msg.pos, Blocks.WEB.getDefaultState()); + mc.player.setInWeb(); + } + }); + + return null; + } + } +} diff --git a/dynamicspawncontrol-1.12.2/src/main/resources/assets/dynamicspawncontrol/lang/en_us.lang b/dynamicspawncontrol-1.12.2/src/main/resources/assets/dynamicspawncontrol/lang/en_us.lang new file mode 100644 index 0000000..a88cf0b --- /dev/null +++ b/dynamicspawncontrol-1.12.2/src/main/resources/assets/dynamicspawncontrol/lang/en_us.lang @@ -0,0 +1,2 @@ +item.dynamicspawncontrol.webbing.name=Webbing +entity.dynamicspawncontrol.webbing.name=Webbing diff --git a/dynamicspawncontrol-1.12.2/src/main/resources/assets/dynamicspawncontrol/lang/ru_ru.lang b/dynamicspawncontrol-1.12.2/src/main/resources/assets/dynamicspawncontrol/lang/ru_ru.lang new file mode 100644 index 0000000..6254c49 --- /dev/null +++ b/dynamicspawncontrol-1.12.2/src/main/resources/assets/dynamicspawncontrol/lang/ru_ru.lang @@ -0,0 +1,2 @@ +item.dynamicspawncontrol.webbing.name=Паутина-ловушка +entity.dynamicspawncontrol.webbing.name=Паутина-ловушка \ No newline at end of file diff --git a/dynamicspawncontrol-1.12.2/src/main/resources/assets/dynamicspawncontrol/recipes/webbing.json b/dynamicspawncontrol-1.12.2/src/main/resources/assets/dynamicspawncontrol/recipes/webbing.json new file mode 100644 index 0000000..4120897 --- /dev/null +++ b/dynamicspawncontrol-1.12.2/src/main/resources/assets/dynamicspawncontrol/recipes/webbing.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "SSS", + "SWS", + "SSS" + ], + "key": { + "S": { + "item": "minecraft:string" + }, + "W": { + "item": "minecraft:slime_ball" + } + }, + "result": { + "item": "dynamicspawncontrol:webbing", + "count": 1 + } +} diff --git a/dynamicspawncontrol-1.12.2/src/main/resources/assets/dynamicspawncontrol/textures/gui/src_skull.jpg b/dynamicspawncontrol-1.12.2/src/main/resources/assets/dynamicspawncontrol/textures/gui/src_skull.jpg new file mode 100644 index 0000000..2eda037 Binary files /dev/null and b/dynamicspawncontrol-1.12.2/src/main/resources/assets/dynamicspawncontrol/textures/gui/src_skull.jpg differ