下面列出了org.bukkit.craftbukkit.v1_8_R3.CraftWorld#org.bukkit.entity.LivingEntity 实例代码,或者点击链接到github查看源代码,也可以在右侧发表评论。
@EventHandler
public void onUnload(ChunkUnloadEvent event) {
Chunk unloadedChunk = event.getChunk();
for (Entity entity : unloadedChunk.getEntities()) {
if (entity instanceof LivingEntity) {
Object handle = BukkitUnwrapper.getInstance().unwrap(entity);
if (handle instanceof ControllableEntityHandle) {
ControllableEntity controllableEntity = ((ControllableEntityHandle) handle).getControllableEntity();
if (controllableEntity != null && controllableEntity.isSpawned()) {
this.SPAWN_QUEUE.add(new EntityChunkData(controllableEntity, entity.getLocation()));
controllableEntity.despawn(DespawnReason.CHUNK_UNLOAD);
}
}
}
}
}
@EventHandler (priority = EventPriority.HIGHEST)
public void onDamage(EntityDamageByEntityEvent event){
if (event.isCancelled()) return;
if (!event.getEntity().getType().equals(EntityType.ENDERMAN)) return;
EntityType entityType = EntityFinder.getRealDamager(event).getType();
if (entityType == null) return;
if (!entityType.equals(EntityType.PLAYER)) return;
EliteMobEntity eliteMobEntity = EntityTracker.getEliteMobEntity(event.getEntity());
if (eliteMobEntity == null) return;
Block block = EntityFinder.getRealDamager(event).getLocation().getBlock().getLocation().add(new Vector(0, 2, 0)).getBlock();
if (block.getType().equals(Material.AIR) || block.getType().equals(Material.WATER)) return;
eliteMobEntity.setHasSpecialLoot(false);
AntiExploitMessage.sendWarning((LivingEntity) event.getEntity());
}
@Override
public Collection<LivingEntity> getEntitiesInRange() {
TileEntity tileEntity = this.getTileEntityFromWorld();
if (tileEntity instanceof TileEntityBeacon) {
TileEntityBeacon beacon = (TileEntityBeacon) tileEntity;
Collection<EntityPlayer> nms = beacon.getHumansInRange();
Collection<LivingEntity> bukkit = new ArrayList<LivingEntity>(nms.size());
for (EntityPlayer human : nms) {
bukkit.add(human.getBukkitEntity());
}
return bukkit;
}
// block is no longer a beacon
return new ArrayList<LivingEntity>();
}
public void apply() {
Object target = getTarget();
if (!(target instanceof LivingEntity)) {
return;
}
LivingEntity livingEntity = (LivingEntity) target;
final BukkitRunnable runnable = new BukkitRunnable() {
@Override
public void run() {
onUpdate();
}
};
runnable.runTaskAsynchronously(Civs.getInstance());
if (duration > 0) {
BukkitRunnable runnable1 = new BukkitRunnable() {
@Override
public void run() {
runnable.cancel();
}
};
}
}
@Override
protected void execute(final Event e) {
for (final LivingEntity le : entities.getArray(e)) {
if (le instanceof Creeper) {
if (instant) {
((Creeper) le).explode();
} else if (stop) {
((Creeper) le).setIgnited(false);
} else {
if (paper) {
((Creeper) le).setIgnited(true);
} else {
((Creeper) le).ignite();
}
}
}
}
}
public Map<CreatureType, Integer> getCreatureCount(us.talabrek.ultimateskyblock.api.IslandInfo islandInfo) {
Map<CreatureType, Integer> mapCount = new HashMap<>();
for (CreatureType type : CreatureType.values()) {
mapCount.put(type, 0);
}
Location islandLocation = islandInfo.getIslandLocation();
ProtectedRegion islandRegionAt = WorldGuardHandler.getIslandRegionAt(islandLocation);
if (islandRegionAt != null) {
// Nether and Overworld regions are more or less equal (same x,z coords)
List<LivingEntity> creatures = WorldGuardHandler.getCreaturesInRegion(plugin.getWorldManager().getWorld(),
islandRegionAt);
World nether = plugin.getWorldManager().getNetherWorld();
if (nether != null) {
creatures.addAll(WorldGuardHandler.getCreaturesInRegion(nether, islandRegionAt));
}
for (LivingEntity creature : creatures) {
CreatureType key = getCreatureType(creature);
if (!mapCount.containsKey(key)) {
mapCount.put(key, 0);
}
mapCount.put(key, mapCount.get(key) + 1);
}
}
return mapCount;
}
public static EntityLivingNMS makeMobAttackTarget(LivingEntity mob, double speed, double follow,
double attackDamage) {
try {
Object handler = getHandle(mob);
if (!EntityInsentient.isInstance(handler)) {
throw new IllegalArgumentException("Entity must be instance of EntityInsentient!!");
}
EntityLivingNMS entityLiving = new EntityLivingNMS(handler);
GoalSelector selector = entityLiving.getGoalSelector();
selector.clearSelector();
selector.registerPathfinder(0, PathfinderGoalMeleeAttack
.getConstructor(EntityCreature, double.class, boolean.class).newInstance(handler, 1.0D, false));
entityLiving.setAttribute(Attribute.MOVEMENT_SPEED, speed);
entityLiving.setAttribute(Attribute.FOLLOW_RANGE, follow);
entityLiving.setAttribute(Attribute.ATTACK_DAMAGE, attackDamage);
entityLiving.getTargetSelector().clearSelector();
return entityLiving;
} catch (Throwable ignored) {
}
return null;
}
@EventHandler(priority=EventPriority.HIGHEST)
public void onCancelPVP(EntityDamageByEntityEvent e) {
if(!e.isCancelled()) return;
if(this.expansion.getNoEntryHandler().getNoEntryMode() != NoEntryMode.VULNERABLE) return;
Entity entity = e.getEntity();
if(!(entity instanceof Player)) return;
ICombatLogX plugin = this.expansion.getPlugin();
ICombatManager manager = plugin.getCombatManager();
Player player = (Player) entity;
if(!manager.isInCombat(player)) return;
LivingEntity enemy = manager.getEnemy(player);
if(enemy == null) return;
e.setCancelled(false);
this.expansion.sendNoEntryMessage(player, enemy);
}
@EventHandler(priority=EventPriority.HIGHEST)
public void onPreventPVP(DisallowedPVPEvent e) {
NoEntryHandler handler = this.expansion.getNoEntryHandler();
NoEntryMode mode = handler.getNoEntryMode();
if(mode != NoEntryMode.VULNERABLE) return;
ICombatLogX plugin = this.expansion.getPlugin();
ICombatManager manager = plugin.getCombatManager();
Player player = e.getDefender();
if(!manager.isInCombat(player)) return;
LivingEntity enemy = manager.getEnemy(player);
if(enemy == null) return;
e.setCancelled(true);
this.expansion.sendNoEntryMessage(player, enemy);
}
@Override
public boolean isTarget(LivingEntity ent, String prefix, String value) {
try {
if (prefix.equals("war_team") && ent instanceof Player) {
Team team = Team.getTeamByPlayerName(ent.getName());
if (team.getName().equalsIgnoreCase(value)) {
return true;
}
else {
return false;
}
}
}
catch (Exception ex) {
ex.printStackTrace();
}
return false;
}
public static EntityBreakDoorEvent callEntityBreakDoorEvent(net.minecraft.entity.Entity entity, int x, int y, int z) {
org.bukkit.entity.Entity entity1 = entity.getBukkitEntity();
Block block = entity1.getWorld().getBlockAt(x, y, z);
EntityBreakDoorEvent event = new EntityBreakDoorEvent((LivingEntity) entity1, block);
entity1.getServer().getPluginManager().callEvent(event);
return event;
}
@Override
public void start() {
this.getControllableEntity().setTarget((LivingEntity) this.target.getBukkitEntity());
if (this.getTamer() != null) {
this.lastAttackTick = this.getTamer().aM();
}
super.start();
}
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void onEntityDamaged(EntityDamageByEntityEvent ev) {
if (!plugin.cfg.damageStatEnabled) return;
if (!(ev.getEntity() instanceof LivingEntity)) return;
UUID playerId = null;
if (ev.getDamager() instanceof Player) {
playerId = ev.getDamager().getUniqueId();
} else if (ev.getDamager() instanceof Projectile) {
if (((Projectile) ev.getDamager()).getShooter() instanceof Player) {
playerId = ((Player) ((Projectile) ev.getDamager()).getShooter()).getUniqueId();
} else {
return;
}
} else {
return;
}
UUID mobUid = ev.getEntity().getUniqueId();
double damage = ev.getFinalDamage();
double health = ((LivingEntity) ev.getEntity()).getHealth();
if (damage > health) damage = health;
Map<UUID, Double> damageMap = entityList.getUnchecked(mobUid);
if (damageMap.containsKey(playerId)) {
damageMap.put(playerId, damageMap.get(playerId) + damage);
} else {
damageMap.put(playerId, damage);
}
}
@Override
protected LivingEntity[] get(final Event e, final Projectile[] source) {
return get(source, new Converter<Projectile, LivingEntity>() {
@Override
@Nullable
public LivingEntity convert(final Projectile p) {
final Object o = ProjectileUtils.getShooter(p);
if (o instanceof LivingEntity)
return (LivingEntity) o;
return null;
}
});
}
public static void setHorseSpeed(LivingEntity entity, double amount) {
if (!isHorse(entity)) {
return;
}
EntityInsentient nmsEntity = (EntityInsentient) ((CraftLivingEntity) entity).getHandle();
AttributeInstance attributes = nmsEntity.getAttributeInstance(GenericAttributes.d);
AttributeModifier modifier = new AttributeModifier(movementSpeedUID, "civcraft horse movement speed", amount, 0);
attributes.b(modifier); //remove the modifier, adding a duplicate causes errors
attributes.a(modifier); //add the modifier
//done??
}
@Override
public HashMap<String, Double> getVariables() {
Object target = getTarget();
HashMap<String, Double> returnMap = new HashMap<String, Double>();
if (!(target instanceof LivingEntity)) {
return returnMap;
}
LivingEntity le = (LivingEntity) target;
returnMap.put("fireTicks", (double) le.getFireTicks());
return returnMap;
}
@Override
public LivingEntity getTarget() {
if (handle() == null) {
return null;
}
if (handle() instanceof EntityInsentient) {
EntityLiving targetHandle = ((EntityInsentient) handle()).getGoalTarget();
if (targetHandle != null && targetHandle.getBukkitEntity() instanceof LivingEntity) {
return (LivingEntity) targetHandle.getBukkitEntity();
}
}
return null;
}
@Override
public void overwriteLivingEntityAI(LivingEntity entity) {
try {
EntityLiving ev = ((CraftLivingEntity) entity).getHandle();
if (!(ev instanceof EntityInsentient)) return;
// overwrite goal selector:
Field goalsField = EntityInsentient.class.getDeclaredField("goalSelector");
goalsField.setAccessible(true);
PathfinderGoalSelector goals = (PathfinderGoalSelector) goalsField.get(ev);
Field listField = PathfinderGoalSelector.class.getDeclaredField("b");
listField.setAccessible(true);
List<?> list = (List<?>) listField.get(goals);
list.clear();
listField = PathfinderGoalSelector.class.getDeclaredField("c");
listField.setAccessible(true);
list = (List<?>) listField.get(goals);
list.clear();
goals.a(0, new PathfinderGoalFloat((EntityInsentient) ev));
goals.a(1, new PathfinderGoalLookAtPlayer((EntityInsentient) ev, EntityHuman.class, 12.0F, 1.0F));
// overwrite target selector:
Field targetsField = EntityInsentient.class.getDeclaredField("targetSelector");
targetsField.setAccessible(true);
PathfinderGoalSelector targets = (PathfinderGoalSelector) targetsField.get(ev);
Field listField2 = PathfinderGoalSelector.class.getDeclaredField("b");
listField2.setAccessible(true);
List<?> list2 = (List<?>) listField.get(targets);
list2.clear();
listField2 = PathfinderGoalSelector.class.getDeclaredField("c");
listField2.setAccessible(true);
list2 = (List<?>) listField.get(targets);
list2.clear();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* Returns a direction to run in, avoiding threatening entities as best as possible.
* Returns a location of the spot to run to.
* Returns null if nowhere to run.
*/
public Location runDirection(Location center) {
for (int i = 0; i < 36; i++) {
threatDists[i] = 1000 * 1000;
}
double range = sentinel.avoidRange;
Vector centerVec = center.toVector();
for (LivingEntity entity : avoidanceList) {
Vector relative = entity.getLocation().toVector().subtract(centerVec);
for (int i = 0; i < 36; i++) {
double dist = relative.distanceSquared(directionReferenceVectors[i].clone().multiply(range));
if (dist < threatDists[i]) {
threatDists[i] = dist;
}
}
}
double longestDistance = 0;
Location runTo = null;
for (int i = 0; i < 36; i++) {
if (threatDists[i] > longestDistance) {
Location newRunTo = findSpotForRunDirection(center, range, directionReferenceVectors[i].clone());
if (newRunTo != null) {
runTo = newRunTo;
longestDistance = threatDists[i];
}
}
}
if (SentinelPlugin.debugMe) {
SentinelPlugin.instance.getLogger().info("(TEMP) Run to get threat distance: " + longestDistance + " to " + runTo + " from " + center.toVector());
}
return runTo;
}
public void damage(double amount, org.bukkit.entity.Entity source) {
net.minecraft.util.DamageSource reason = net.minecraft.util.DamageSource.generic;
if (source instanceof HumanEntity) {
reason = net.minecraft.util.DamageSource.causePlayerDamage(((CraftHumanEntity) source).getHandle());
} else if (source instanceof LivingEntity) {
reason = net.minecraft.util.DamageSource.causeMobDamage(((CraftLivingEntity) source).getHandle());
}
if (entity instanceof net.minecraft.entity.boss.EntityDragon) {
((net.minecraft.entity.boss.EntityDragon) entity).func_82195_e(reason, (float) amount);
} else {
entity.attackEntityFrom(reason, (float) amount);
}
}
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void onMobSpawn(PlayerSpawnEntityEvent event) {
ParticipantState owner = match.getParticipantState(event.getPlayer());
if (event.getEntity() instanceof LivingEntity && owner != null) {
LivingEntity mob = (LivingEntity) event.getEntity();
entities().trackEntity(event.getEntity(), new MobInfo(mob, owner));
}
}
@EventHandler(priority=EventPriority.MONITOR, ignoreCancelled=true)
public void onUntag(PlayerUntagEvent e) {
Player player = e.getPlayer();
LivingEntity previousEnemy = e.getPreviousEnemy();
PlayerUntagEvent.UntagReason untagReason = e.getUntagReason();
ICombatManager combatManager = this.plugin.getCombatManager();
combatManager.punish(player, untagReason, previousEnemy);
sendUntagMessage(player, untagReason);
runUntagCommands(player);
}
@Override
public void tick() {
NMSEntityUtil.getControllerLook(this.getHandle()).a(this.flowerHolder, 30.0F, 30.0F);
if (this.flowerHolder.bZ() == this.acceptTicks) {
this.getControllableEntity().navigateTo((LivingEntity) this.flowerHolder.getBukkitEntity(), this.navigationSpeed > 0 ? this.navigationSpeed : this.getControllableEntity().getSpeed());
this.canAccept = true;
}
if (this.canAccept && this.getHandle().e(this.flowerHolder) < 4.0D) {
this.flowerHolder.a(false);
NMSEntityUtil.getNavigation(this.getHandle()).h();
}
}
@Override
public void effect(Event e, ItemStack item, int level) {
if(e instanceof EntityDamageByEntityEvent) {
EntityDamageByEntityEvent event = (EntityDamageByEntityEvent) e;
LivingEntity target = (LivingEntity) event.getEntity();
target.addPotionEffect(new PotionEffect(PotionEffectType.SLOW, duration + (level-1)*20, strength + level-1), true);
target.addPotionEffect(new PotionEffect(PotionEffectType.BLINDNESS, duration + (level-1)*20, 1), true);
target.addPotionEffect(new PotionEffect(PotionEffectType.WEAKNESS, duration + (level-1)*20, strength + level-1), true);
}
}
@EventHandler(ignoreCancelled = true)
public void onDamage(EntityDamageEvent event) {
if (!main.configStore.actionStore.enabled)
return;
Entity entity = event.getEntity();
ActionStore.ActionType actionType = ActionStore.ActionType.DAMAGE;
if (entity instanceof LivingEntity) {
LivingEntity livingEntity = (LivingEntity) entity;
actionHelper.executeTriggers(actionType, livingEntity, "ANY", livingEntity.getHealth() - event.getFinalDamage());
}
}
@Override
public OfflinePlayer getByEnemy(LivingEntity enemy) {
if(enemy == null) return null;
UUID enemyId = enemy.getUniqueId();
for(Map.Entry<UUID, UUID> entry : uuidToEnemy.entrySet()) {
UUID linkedEnemyId = entry.getValue();
if(!enemyId.equals(linkedEnemyId)) continue;
UUID playerId = entry.getKey();
return Bukkit.getOfflinePlayer(playerId);
}
return null;
}
private String getEntityName(LivingEntity enemy) {
if(enemy == null) return this.plugin.getLanguageMessage("errors.unknown-entity-name");
MultiVersionHandler<?> multiVersionHandler = this.plugin.getMultiVersionHandler();
AbstractNMS nmsHandler = multiVersionHandler.getInterface();
EntityHandler entityHandler = nmsHandler.getEntityHandler();
return entityHandler.getName(enemy);
}
@Override
public void setTargetAi(LivingEntity entity, Iterable ai) {
try {
Ref.putField(((EntityInsentient) getEntityInsentient(entity)).targetSelector, this.pathfinderGoalSelectorSet, ai);
} catch (Throwable t) {
t.printStackTrace();
}
}
@Override
protected void execute(final Event e) {
for (final LivingEntity en : sheep.getArray(e)) {
if (en instanceof Sheep) {
((Sheep) en).setSheared(shear);
}
}
}
@Override
public ItemUseHandler getItemHandler() {
return e -> {
Player p = e.getPlayer();
List<Block> blocks = p.getLineOfSight(null, RANGE);
for (int i = 2; i < blocks.size(); i++) {
Block ground = findGround(blocks.get(i));
Location groundLocation = ground.getLocation();
ground.getWorld().playEffect(groundLocation, Effect.STEP_SOUND, ground.getType());
if (ground.getRelative(BlockFace.UP).getType() == Material.AIR) {
Location loc = ground.getRelative(BlockFace.UP).getLocation().add(0.5, 0.0, 0.5);
FallingBlock block = ground.getWorld().spawnFallingBlock(loc, ground.getBlockData());
block.setDropItem(false);
block.setVelocity(new Vector(0, 0.4 + i * 0.01, 0));
block.setMetadata("seismic_axe", new FixedMetadataValue(SlimefunPlugin.instance, "fake_block"));
}
for (Entity n : ground.getChunk().getEntities()) {
if (n instanceof LivingEntity && n.getType() != EntityType.ARMOR_STAND && n.getLocation().distance(groundLocation) <= 2.0D && !n.getUniqueId().equals(p.getUniqueId())) {
pushEntity(p, n);
}
}
}
for (int i = 0; i < 4; i++) {
damageItem(p, e.getItem());
}
};
}