Skip to content
This repository has been archived by the owner on Apr 12, 2022. It is now read-only.

Commit

Permalink
Projectile Impacts Entity
Browse files Browse the repository at this point in the history
Also improved projectile impacts block.
  • Loading branch information
Xenmai committed Oct 27, 2017
1 parent 617c7e0 commit b52c661
Show file tree
Hide file tree
Showing 3 changed files with 139 additions and 16 deletions.
Expand Up @@ -178,7 +178,8 @@ public void onServerStart(GamePreInitializationEvent event) {
Denizen2Core.register(new EntityLeavesAreaScriptEvent());
Denizen2Core.register(new EntityMovesScriptEvent());
Denizen2Core.register(new EntitySpawnsScriptEvent());
Denizen2Core.register(new ProjectileHitsBlockScriptEvent());
Denizen2Core.register(new ProjectileImpactsBlockScriptEvent());
Denizen2Core.register(new ProjectileImpactsEntityScriptEvent());
// Events: Player
Denizen2Core.register(new ExperienceChangesScriptEvent());
Denizen2Core.register(new LevelChangesScriptEvent());
Expand Down
Expand Up @@ -15,20 +15,20 @@

import java.util.HashMap;

public class ProjectileHitsBlockScriptEvent extends ScriptEvent {
public class ProjectileImpactsBlockScriptEvent extends ScriptEvent {

// <--[event]
// @Since 0.3.0
// @Events
// projectile hits block
// projectile impacts block
//
// @Updated 2017/03/24
// @Updated 2017/10/27
//
// @Group Entity
//
// @Cancellable true
//
// @Triggers when a projectile hits a block.
// @Triggers when a projectile impacts a block.
//
// @Switch entity_type (EntityTypeTag) checks the entity type.
// @Switch block_type (BlockTypeTag) checks the block type.
Expand All @@ -37,32 +37,33 @@ public class ProjectileHitsBlockScriptEvent extends ScriptEvent {
// @Switch weather (TextTag) checks the weather.
//
// @Context
// entity (EntityTag) returns the entity that hit the block.
// location (LocationTag) returns the location of the block hit.
// entity (EntityTag) returns the projectile entity that impacted the block.
// location (LocationTag) returns the location of the block impacted.
// impact_point (LocationTag) returns the precise impact location.
// impact_normal (LocationTag) returns the impact normal of the collision.
//
// @Determinations
// None.
// -->

@Override
public String getName() {
return "ProjectileHitsBlock";
return "ProjectileImpactsBlock";
}

@Override
public boolean couldMatch(ScriptEventData data) {
return data.eventPath.startsWith("projectile hits block");
return data.eventPath.startsWith("projectile impacts block");
}

@Override
public boolean matches(ScriptEventData data) {
return D2SpongeEventHelper.checkEntityType(entity.getInternal().getType(), data, this::error, "entity_type")
&& D2SpongeEventHelper.checkBlockType(material.getInternal(), data, this::error, "block_type")
&& D2SpongeEventHelper.checkWorld(entity.getInternal().getLocation().getExtent(), data, this::error)
&& D2SpongeEventHelper.checkCuboid((new LocationTag(entity.getInternal()
.getLocation())).getInternal(), data, this::error)
&& D2SpongeEventHelper.checkWorld(location.getInternal().world, data, this::error)
&& D2SpongeEventHelper.checkCuboid(location.getInternal(), data, this::error)
&& D2SpongeEventHelper.checkWeather(Utilities.getIdWithoutDefaultPrefix(
entity.getInternal().getLocation().getExtent().getWeather().getId()), data, this::error);
location.getInternal().world.getWeather().getId()), data, this::error);
}

public EntityTag entity;
Expand All @@ -71,6 +72,10 @@ public boolean matches(ScriptEventData data) {

public LocationTag location;

public LocationTag impact_point;

public LocationTag impact_normal;

public CollideBlockEvent.Impact internal;

@Override
Expand All @@ -88,16 +93,20 @@ public HashMap<String, AbstractTagObject> getDefinitions(ScriptEventData data) {
HashMap<String, AbstractTagObject> defs = super.getDefinitions(data);
defs.put("entity", entity);
defs.put("location", location);
defs.put("impact_point", impact_point);
defs.put("impact_normal", impact_normal);
return defs;
}

@Listener
public void onEntityCollidesWithBlock(CollideBlockEvent.Impact evt) {
ProjectileHitsBlockScriptEvent event = (ProjectileHitsBlockScriptEvent) clone();
public void onEntityImpactsBlock(CollideBlockEvent.Impact evt) {
ProjectileImpactsBlockScriptEvent event = (ProjectileImpactsBlockScriptEvent) clone();
event.internal = evt;
event.entity = new EntityTag(evt.getCause().first(Entity.class).get());
event.entity = new EntityTag((Entity) evt.getSource());
event.material = new BlockTypeTag(evt.getTargetBlock().getType());
event.location = new LocationTag(evt.getTargetLocation());
event.impact_point = new LocationTag(evt.getImpactPoint());
event.impact_normal = new LocationTag(evt.getTargetSide().asOffset());
event.cancelled = evt.isCancelled();
event.run();
evt.setCancelled(event.cancelled);
Expand Down
@@ -0,0 +1,113 @@
package com.denizenscript.denizen2sponge.events.entity;

import com.denizenscript.denizen2core.events.ScriptEvent;
import com.denizenscript.denizen2core.tags.AbstractTagObject;
import com.denizenscript.denizen2sponge.Denizen2Sponge;
import com.denizenscript.denizen2sponge.events.D2SpongeEventHelper;
import com.denizenscript.denizen2sponge.tags.objects.BlockTypeTag;
import com.denizenscript.denizen2sponge.tags.objects.EntityTag;
import com.denizenscript.denizen2sponge.tags.objects.LocationTag;
import com.denizenscript.denizen2sponge.utilities.Utilities;
import org.spongepowered.api.Sponge;
import org.spongepowered.api.entity.Entity;
import org.spongepowered.api.event.Listener;
import org.spongepowered.api.event.entity.CollideEntityEvent;

import java.util.HashMap;

public class ProjectileImpactsEntityScriptEvent extends ScriptEvent {

// <--[event]
// @Since 0.3.0
// @Events
// projectile impacts entity
//
// @Updated 2017/10/27
//
// @Group Entity
//
// @Cancellable true
//
// @Triggers when a projectile impacts an entity.
//
// @Switch type (EntityTypeTag) checks the projectile type.
// @Switch other_type (EntityTypeTag) checks the other entity type.
// @Switch world (WorldTag) checks the world.
// @Switch cuboid (CuboidTag) checks the cuboid area.
// @Switch weather (TextTag) checks the weather.
//
// @Context
// entity (EntityTag) returns the projectile entity that impacted the other entity.
// other_entity (EntityTag) returns the entity that was impacted.
// impact_point (LocationTag) returns the precise impact location.
//
// @Determinations
// None.
// -->

@Override
public String getName() {
return "ProjectileImpactsEntity";
}

@Override
public boolean couldMatch(ScriptEventData data) {
return data.eventPath.startsWith("projectile impacts entity");
}

@Override
public boolean matches(ScriptEventData data) {
return D2SpongeEventHelper.checkEntityType(entity.getInternal().getType(), data, this::error, "type")
&& D2SpongeEventHelper.checkEntityType(other_entity.getInternal().getType(), data, this::error, "other_type")
&& D2SpongeEventHelper.checkWorld(impact_point.getInternal().world, data, this::error)
&& D2SpongeEventHelper.checkCuboid(impact_point.getInternal(), data, this::error)
&& D2SpongeEventHelper.checkWeather(Utilities.getIdWithoutDefaultPrefix(
impact_point.getInternal().world.getWeather().getId()), data, this::error);
}

public EntityTag entity;

public EntityTag other_entity;

public LocationTag impact_point;

public CollideEntityEvent.Impact internal;

@Override
public void enable() {
Sponge.getEventManager().registerListeners(Denizen2Sponge.instance, this);
}

@Override
public void disable() {
Sponge.getEventManager().unregisterListeners(this);
}

@Override
public HashMap<String, AbstractTagObject> getDefinitions(ScriptEventData data) {
HashMap<String, AbstractTagObject> defs = super.getDefinitions(data);
defs.put("entity", entity);
defs.put("other_entity", other_entity);
defs.put("impact_point", impact_point);
return defs;
}

@Listener
public void onEntityImpactsEntity(CollideEntityEvent.Impact evt) {
ProjectileImpactsEntityScriptEvent event = (ProjectileImpactsEntityScriptEvent) clone();
event.internal = evt;
Entity projectile = (Entity) evt.getSource();
event.entity = new EntityTag(projectile);
evt.getEntities().remove(projectile);
event.other_entity = new EntityTag(evt.getEntities().iterator().next());
event.impact_point = new LocationTag(evt.getImpactPoint());
event.cancelled = evt.isCancelled();
event.run();
evt.setCancelled(event.cancelled);
}

@Override
public void applyDetermination(boolean errors, String determination, AbstractTagObject value) {
super.applyDetermination(errors, determination, value);
}
}

0 comments on commit b52c661

Please sign in to comment.