-
-
Notifications
You must be signed in to change notification settings - Fork 314
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
11 changed files
with
735 additions
and
26 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
185 changes: 185 additions & 0 deletions
185
src/main/java/net/citizensnpcs/npc/entity/EndermiteController.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,185 @@ | ||
package net.citizensnpcs.npc.entity; | ||
|
||
import net.citizensnpcs.api.event.NPCPushEvent; | ||
import net.citizensnpcs.api.npc.NPC; | ||
import net.citizensnpcs.npc.CitizensNPC; | ||
import net.citizensnpcs.npc.MobEntityController; | ||
import net.citizensnpcs.npc.ai.NPCHolder; | ||
import net.citizensnpcs.util.NMS; | ||
import net.citizensnpcs.util.Util; | ||
import net.minecraft.server.v1_8_R1.Block; | ||
import net.minecraft.server.v1_8_R1.BlockPosition; | ||
import net.minecraft.server.v1_8_R1.EntityEndermite; | ||
import net.minecraft.server.v1_8_R1.NBTTagCompound; | ||
import net.minecraft.server.v1_8_R1.World; | ||
|
||
import org.bukkit.Bukkit; | ||
import org.bukkit.craftbukkit.v1_8_R1.CraftServer; | ||
import org.bukkit.craftbukkit.v1_8_R1.entity.CraftEndermite; | ||
import org.bukkit.craftbukkit.v1_8_R1.entity.CraftEntity; | ||
import org.bukkit.entity.Endermite; | ||
import org.bukkit.util.Vector; | ||
|
||
public class EndermiteController extends MobEntityController { | ||
public EndermiteController() { | ||
super(EntityEndermiteNPC.class); | ||
} | ||
|
||
@Override | ||
public Endermite getBukkitEntity() { | ||
return (Endermite) super.getBukkitEntity(); | ||
} | ||
|
||
public static class EndermiteNPC extends CraftEndermite implements NPCHolder { | ||
private final CitizensNPC npc; | ||
|
||
public EndermiteNPC(EntityEndermiteNPC entity) { | ||
super((CraftServer) Bukkit.getServer(), entity); | ||
this.npc = entity.npc; | ||
} | ||
|
||
@Override | ||
public NPC getNPC() { | ||
return npc; | ||
} | ||
} | ||
|
||
public static class EntityEndermiteNPC extends EntityEndermite implements NPCHolder { | ||
private final CitizensNPC npc; | ||
|
||
public EntityEndermiteNPC(World world) { | ||
this(world, null); | ||
} | ||
|
||
public EntityEndermiteNPC(World world, NPC npc) { | ||
super(world); | ||
this.npc = (CitizensNPC) npc; | ||
if (npc != null) { | ||
NMS.clearGoals(goalSelector, targetSelector); | ||
} | ||
} | ||
|
||
@Override | ||
protected void a(double d0, boolean flag, Block block, BlockPosition blockposition) { | ||
if (npc == null || !npc.isFlyable()) { | ||
super.a(d0, flag, block, blockposition); | ||
} | ||
} | ||
|
||
@Override | ||
protected String bn() { | ||
return npc == null ? super.bn() : npc.data().get(NPC.HURT_SOUND_METADATA, super.bn()); | ||
} | ||
|
||
@Override | ||
protected String bo() { | ||
return npc == null ? super.bo() : npc.data().get(NPC.DEATH_SOUND_METADATA, super.bo()); | ||
} | ||
|
||
@Override | ||
public boolean cb() { | ||
if (npc == null) | ||
return super.cb(); | ||
boolean protectedDefault = npc.data().get(NPC.DEFAULT_PROTECTED_METADATA, true); | ||
if (!protectedDefault || !npc.data().get(NPC.LEASH_PROTECTED_METADATA, protectedDefault)) | ||
return super.cb(); | ||
if (super.cb()) { | ||
unleash(true, false); // clearLeash with client update | ||
} | ||
return false; // shouldLeash | ||
} | ||
|
||
@Override | ||
public void collide(net.minecraft.server.v1_8_R1.Entity entity) { | ||
// this method is called by both the entities involved - cancelling | ||
// it will not stop the NPC from moving. | ||
super.collide(entity); | ||
if (npc != null) | ||
Util.callCollisionEvent(npc, entity.getBukkitEntity()); | ||
} | ||
|
||
@Override | ||
public boolean d(NBTTagCompound save) { | ||
return npc == null ? super.d(save) : false; | ||
} | ||
|
||
@Override | ||
protected void D() { | ||
if (npc == null) { | ||
super.D(); | ||
} | ||
} | ||
|
||
@Override | ||
public void doTick() { | ||
super.doTick(); | ||
if (npc != null) | ||
npc.update(); | ||
} | ||
|
||
@Override | ||
public void e(float f, float f1) { | ||
if (npc == null || !npc.isFlyable()) { | ||
super.e(f, f1); | ||
} | ||
} | ||
|
||
@Override | ||
public void g(double x, double y, double z) { | ||
if (npc == null) { | ||
super.g(x, y, z); | ||
return; | ||
} | ||
if (NPCPushEvent.getHandlerList().getRegisteredListeners().length == 0) { | ||
if (!npc.data().get(NPC.DEFAULT_PROTECTED_METADATA, true)) | ||
super.g(x, y, z); | ||
return; | ||
} | ||
Vector vector = new Vector(x, y, z); | ||
NPCPushEvent event = Util.callPushEvent(npc, vector); | ||
if (!event.isCancelled()) { | ||
vector = event.getCollisionVector(); | ||
super.g(vector.getX(), vector.getY(), vector.getZ()); | ||
} | ||
// when another entity collides, this method is called to push the | ||
// NPC so we prevent it from doing anything if the event is | ||
// cancelled. | ||
} | ||
|
||
@Override | ||
public void g(float f, float f1) { | ||
if (npc == null || !npc.isFlyable()) { | ||
super.g(f, f1); | ||
} else { | ||
NMS.flyingMoveLogic(this, f, f1); | ||
} | ||
} | ||
|
||
@Override | ||
public CraftEntity getBukkitEntity() { | ||
if (bukkitEntity == null && npc != null) | ||
bukkitEntity = new EndermiteNPC(this); | ||
return super.getBukkitEntity(); | ||
} | ||
|
||
@Override | ||
public NPC getNPC() { | ||
return npc; | ||
} | ||
|
||
@Override | ||
public boolean j_() { | ||
if (npc == null || !npc.isFlyable()) { | ||
return super.j_(); | ||
} else { | ||
return false; | ||
} | ||
} | ||
|
||
@Override | ||
protected String z() { | ||
return npc == null || !npc.data().has(NPC.AMBIENT_SOUND_METADATA) ? super.z() : npc.data().get( | ||
NPC.AMBIENT_SOUND_METADATA, super.z()); | ||
} | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.