use of org.spongepowered.common.interfaces.entity.IMixinEntityLivingBase in project SpongeCommon by SpongePowered.
the class DamageableDataProcessor method set.
@SuppressWarnings("unchecked")
@Override
protected boolean set(EntityLivingBase dataHolder, Map<Key<?>, Object> keyValues) {
final Optional<EntitySnapshot> lastAttacker = (Optional<EntitySnapshot>) keyValues.get(Keys.LAST_ATTACKER);
if (lastAttacker == null || !lastAttacker.isPresent()) {
dataHolder.setRevengeTarget(null);
return true;
}
if (lastAttacker.get().getUniqueId().isPresent()) {
final Optional<Entity> optionalEntity = lastAttacker.get().restore();
if (optionalEntity.isPresent()) {
final Entity entity = optionalEntity.get();
if (entity.isLoaded() && entity instanceof EntityLivingBase) {
dataHolder.setRevengeTarget((EntityLivingBase) entity);
((IMixinEntityLivingBase) dataHolder).setLastDamage(((Optional<Double>) keyValues.get(Keys.LAST_DAMAGE)).orElse(0D));
return true;
}
}
}
return false;
}
use of org.spongepowered.common.interfaces.entity.IMixinEntityLivingBase in project SpongeCommon by SpongePowered.
the class MixinEntityLivingBase method causeTrackDeathUpdate.
@Redirect(method = "onEntityUpdate", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/EntityLivingBase;onDeathUpdate()V"))
private void causeTrackDeathUpdate(EntityLivingBase entityLivingBase) {
if (!entityLivingBase.world.isRemote) {
final PhaseTracker phaseTracker = PhaseTracker.getInstance();
try (CauseStackManager.StackFrame frame = Sponge.getCauseStackManager().pushCauseFrame();
PhaseContext<?> context = EntityPhase.State.DEATH_UPDATE.createPhaseContext().source(entityLivingBase).buildAndSwitch()) {
Sponge.getCauseStackManager().pushCause(entityLivingBase);
((IMixinEntityLivingBase) entityLivingBase).onSpongeDeathUpdate();
}
} else {
((IMixinEntityLivingBase) entityLivingBase).onSpongeDeathUpdate();
}
}
use of org.spongepowered.common.interfaces.entity.IMixinEntityLivingBase in project SpongeForge by SpongePowered.
the class SpongeForgeEventFactory method callLivingDropsEvent.
@SuppressWarnings("unchecked")
public static DropItemEvent.Destruct callLivingDropsEvent(Event event) {
DropItemEvent.Destruct spongeEvent = (DropItemEvent.Destruct) event;
final Cause cause = spongeEvent.getCause();
Object source = cause.root();
Optional<DamageSource> damageSource = cause.first(DamageSource.class);
final Optional<Entity> spawnEntity = cause.first(Entity.class);
final Optional<SpawnType> spawnType = cause.getContext().get(EventContextKeys.SPAWN_TYPE);
if (!spawnType.isPresent() || !damageSource.isPresent() || !spawnEntity.isPresent()) {
// Mods expect EntityJoinWorldEvent to trigger
callEntityJoinWorldEvent(spongeEvent);
return spongeEvent;
}
Entity entity = spawnEntity.get();
if (entity == null || !(entity instanceof EntityLivingBase)) {
return spongeEvent;
}
LivingDropsEvent forgeEvent = null;
if (entity instanceof EntityPlayer) {
EntityPlayer player = (EntityPlayer) entity;
forgeEvent = new PlayerDropsEvent(player, (net.minecraft.util.DamageSource) damageSource.get(), (List<EntityItem>) (List<?>) spongeEvent.getEntities(), ((IMixinEntityLivingBase) entity).getRecentlyHit() > 0);
} else {
forgeEvent = new LivingDropsEvent((EntityLivingBase) entity, (net.minecraft.util.DamageSource) damageSource.get(), (List<EntityItem>) (List<?>) spongeEvent.getEntities(), 0, ((IMixinEntityLivingBase) entity).getRecentlyHit() > 0);
}
((IMixinEventBus) MinecraftForge.EVENT_BUS).post(forgeEvent, true);
if (forgeEvent.isCanceled()) {
spongeEvent.setCancelled(true);
} else {
callEntityJoinWorldEvent(spongeEvent);
}
return spongeEvent;
}
Aggregations