Skip to content

Commit

Permalink
MythicMob spawns event (#330)
Browse files Browse the repository at this point in the history
* Added MM mob spawns event

* MythicMob Spawns update

* MM Event updates and fixes

* removed the oops....

* requested fixes

* reverse if statement order

* rmore fixes

* yet more fixes
  • Loading branch information
Ph4i1ur3 committed Jul 31, 2020
1 parent bae7974 commit 03e5fde
Show file tree
Hide file tree
Showing 3 changed files with 137 additions and 49 deletions.
Expand Up @@ -15,6 +15,7 @@
import io.lumine.xikage.mythicmobs.mobs.ActiveMob;
import io.lumine.xikage.mythicmobs.mobs.MythicMob;
import com.denizenscript.depenizen.bukkit.events.mythicmobs.MythicMobsDeathEvent;
import com.denizenscript.depenizen.bukkit.events.mythicmobs.MythicMobsSpawnEvent;
import io.lumine.xikage.mythicmobs.MythicMobs;
import com.denizenscript.denizen.utilities.DenizenAPI;
import com.denizenscript.denizencore.events.ScriptEvent;
Expand All @@ -34,6 +35,7 @@ public void init() {
ObjectFetcher.registerWithObjectFetcher(MythicMobsMobTag.class);
PropertyParser.registerProperty(MythicMobsEntityProperties.class, EntityTag.class);
ScriptEvent.registerScriptEvent(new MythicMobsDeathEvent());
ScriptEvent.registerScriptEvent(new MythicMobsSpawnEvent());
DenizenAPI.getCurrentInstance().getCommandRegistry().registerCommand(MythicSpawnCommand.class);

// <--[tag]
Expand Down
Expand Up @@ -9,7 +9,6 @@
import com.denizenscript.denizen.objects.EntityTag;
import com.denizenscript.denizen.objects.ItemTag;
import com.denizenscript.denizencore.scripts.ScriptEntryData;
import com.denizenscript.denizencore.utilities.CoreUtilities;
import io.lumine.xikage.mythicmobs.api.bukkit.events.MythicMobDeathEvent;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
Expand All @@ -22,15 +21,17 @@ public class MythicMobsDeathEvent extends BukkitScriptEvent implements Listener

// <--[event]
// @Events
// mythicmob mob dies (by <entity>) (in <area>)
// mythicmob mob death (by <entity>) (in <area>)
// mythicmob mob killed (by <entity>) (in <area>)
// mythicmob <mob> dies (by <entity>) (in <area>)
// mythicmob <mob> death (by <entity>) (in <area>)
// mythicmob <mob> killed (by <entity>) (in <area>)
// mythicmob mob dies (by <entity>)
// mythicmob mob death (by <entity>)
// mythicmob mob killed (by <entity>)
// mythicmob <mob> dies (by <entity>)
// mythicmob <mob> death (by <entity>)
// mythicmob <mob> killed (by <entity>)

//
// @Regex ^on mythicmob [^\s]+ (dies|death|killed)( by [^\s]+)?( in ((notable (cuboid|ellipsoid))|([^\s]+)))?$
// @Regex ^on mythicmob [^\s]+ (dies|death|killed)( by [^\s]+)?$
//
// @Switch in:<area> to only process the event if it occurred within a specified area.
//
// @Triggers when a MythicMob dies.
//
Expand All @@ -56,13 +57,9 @@ public MythicMobsDeathEvent() {

public static MythicMobsDeathEvent instance;
public MythicMobDeathEvent event;
public MythicMobsMobTag mob;
public MythicMobsMobTag mythicmob;
public EntityTag entity;
public EntityTag killer;
public ElementTag level;
public ElementTag experience;
public ElementTag currency;
public List<ItemStack> newDrops;

@Override
public boolean couldMatch(ScriptPath path) {
Expand All @@ -76,22 +73,17 @@ public boolean matches(ScriptPath path) {
String mob = path.eventArgLowerAt(1);

if (!mob.equals("mob")
&& !mob.equals(CoreUtilities.toLowerCase(this.mob.getMobType().getInternalName()))) {
&& runGenericCheck(mob, mythicmob.getMobType().getInternalName())) {
return false;
}

// TODO: Remove the stupid from this...
if ((path.eventArgLowerAt(3).equals("by") || path.eventArgLowerAt(4).equals("by"))
&& !tryEntity(killer, path.eventArgLowerAt(4))
&& !tryEntity(killer, path.eventArgLowerAt(5))) {
if ((path.eventArgLowerAt(3).equals("by"))
&& !tryEntity(killer, path.eventArgLowerAt(4))) {
return false;
}

if (!runInCheck(path, entity.getLocation())
&& !runInCheck(path, killer.getLocation())) {
return false;
}

return super.matches(path);
}

Expand All @@ -102,22 +94,16 @@ public String getName() {

@Override
public boolean applyDetermination(ScriptPath path, ObjectTag determinationObj) {
if (isDefaultDetermination(determinationObj)) {
String determination = determinationObj.toString();
Argument arg = new Argument(determination);
if (Argument.valueOf(determination).matchesArgumentList(ItemTag.class)) {
if (newDrops == null) {
newDrops = new ArrayList<>();
String determination = determinationObj.toString();
if (Argument.valueOf(determination).matchesArgumentList(ItemTag.class)) {
List<ItemStack> newDrops = new ArrayList<>();
for (ItemTag item : ListTag.valueOf(determination, getTagContext(path)).filter(ItemTag.class, path.container, true)) {
if (item != null) {
newDrops.add(item.getItemStack());
}
List<ItemTag> items = ListTag.valueOf(determination, getTagContext(path)).filter(ItemTag.class, path.container, true);
for (ItemTag i : items) {
newDrops.add(i.getItemStack());
}
if (newDrops != null && !newDrops.isEmpty()) {
event.setDrops(newDrops);
}
return true;
}
event.setDrops(newDrops);
return true;
}
return super.applyDetermination(path, determinationObj);
}
Expand All @@ -130,41 +116,33 @@ public ScriptEntryData getScriptEntryData() {
@Override
public ObjectTag getContext(String name) {
if (name.equals("mob")) {
return mob;
return mythicmob;
}
else if (name.equals("killer")) {
return killer;
}
else if (name.equals("entity")) {
return entity;
}
else if (name.equals("xp")) {
return experience;
}
else if (name.equals("currency")) {
return currency;
}
else if (name.equals("drops")) {
ListTag oldDrops = new ListTag();
ListTag drops = new ListTag();
for (ItemStack i : event.getDrops()) {
oldDrops.addObject(new ItemTag(i));
drops.addObject(new ItemTag(i));
}
return oldDrops;
return drops;
}
else if (name.equals("level")) {
return level;
return new ElementTag(event.getMobLevel());
}
return super.getContext(name);
}

@EventHandler
public void onMythicMobDeath(MythicMobDeathEvent event) {
mob = new MythicMobsMobTag(event.getMob());
mythicmob = new MythicMobsMobTag(event.getMob());
entity = new EntityTag(event.getEntity());
EntityTag.rememberEntity(entity.getBukkitEntity());
killer = new EntityTag(event.getKiller());
level = new ElementTag(event.getMobLevel());
newDrops = null;
this.event = event;
fire(event);
EntityTag.forgetEntity(entity.getBukkitEntity());
Expand Down
@@ -0,0 +1,108 @@
package com.denizenscript.depenizen.bukkit.events.mythicmobs;

import com.denizenscript.denizencore.objects.*;
import com.denizenscript.denizencore.objects.core.ElementTag;
import com.denizenscript.depenizen.bukkit.objects.mythicmobs.MythicMobsMobTag;
import com.denizenscript.denizen.events.BukkitScriptEvent;
import com.denizenscript.denizen.objects.EntityTag;
import com.denizenscript.denizen.objects.LocationTag;
import io.lumine.xikage.mythicmobs.adapters.AbstractLocation;
import io.lumine.xikage.mythicmobs.api.bukkit.events.MythicMobSpawnEvent;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;


public class MythicMobsSpawnEvent extends BukkitScriptEvent implements Listener {

// <--[event]
// @Events
// mythicmob mob spawns
// mythicmob <mob> spawns
//
// @Regex ^on mythicmob [^\s]+ spawns$
//
// @Switch in:<area> to only process the event if it occurred within a specified area.
//
// @Triggers when a MythicMob spawns.
//
// @Context
// <context.mob> Returns the MythicMob that is spawning.
// <context.entity> Returns the EntityTag for the MythicMob.
// <context.location> Returns the LocationTag of where the MythicMob will spawn.
// <context.from_spawner> Returns true if the mob was from a spawner.
// <context.spawner_location> Returns the LocationTag of the spawner that spawned the mob, if any.
//
// @Plugin Depenizen, MythicMobs
//
// @Group Depenizen
//
// -->

public MythicMobsSpawnEvent() {
instance = this;
}

public static MythicMobsSpawnEvent instance;
public MythicMobSpawnEvent event;
public MythicMobsMobTag mythicmob;
public LocationTag location;

@Override
public boolean couldMatch(ScriptPath path) {
if (!path.eventLower.startsWith("mythicmob")) {
return false;
}
if (!path.eventArgLowerAt(2).equals("spawns")) {
return false;
}
return true;
}

@Override
public boolean matches(ScriptPath path) {
String mob = path.eventArgLowerAt(1);
if (!mob.equals("mob") && !runGenericCheck(mob, mythicmob.getMobType().getInternalName())) {
return false;
}
if (!runInCheck(path, location)) {
return false;
}
return super.matches(path);
}

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

@Override
public ObjectTag getContext(String name) {
if (name.equals("mob")) {
return mythicmob;
}
else if (name.equals("entity")) {
return new EntityTag(event.getEntity());
}
else if (name.equals("location")) {
return location;
}
else if (name.equals("from_spawner")) {
return new ElementTag(event.isFromMythicSpawner());
}
else if (name.equals("spawner_location") && event.isFromMythicSpawner()) {
AbstractLocation loc = event.getMythicSpawner().getLocation();
return new LocationTag(loc.getX(), loc.getY(), loc.getZ(), loc.getWorld().getName());
}
return super.getContext(name);
}

@EventHandler
public void onMythicMobSpawns(MythicMobSpawnEvent event) {
mythicmob = new MythicMobsMobTag(event.getMob());
location = new LocationTag(event.getLocation());
this.event = event;
EntityTag.rememberEntity(event.getEntity());
fire(event);
EntityTag.forgetEntity(event.getEntity());
}
}

0 comments on commit 03e5fde

Please sign in to comment.