Skip to content

Commit

Permalink
Merge pull request #435 from macjuul/misc-new-stuff
Browse files Browse the repository at this point in the history
Added 'collisionrule' and 'deathmessagevisibility' options for teams & entity ai functions
  • Loading branch information
PseudoKnight committed Jul 31, 2016
2 parents 8239b7d + 7115c57 commit 2214521
Show file tree
Hide file tree
Showing 11 changed files with 211 additions and 3 deletions.
2 changes: 2 additions & 0 deletions src/main/java/com/laytonsmith/abstraction/MCLivingEntity.java
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@ public interface MCLivingEntity extends MCEntity, MCProjectileSource {
public int getRemainingAir();
public boolean isGliding();
public boolean isLeashed();
public boolean hasAI();
public void resetMaxHealth();
public void setCanPickupItems(boolean pickup);
public void setRemoveWhenFarAway(boolean remove);
Expand All @@ -64,6 +65,7 @@ public interface MCLivingEntity extends MCEntity, MCProjectileSource {
public void setRemainingAir(int ticks);
public void setTarget(MCLivingEntity target, Target t);
public void setGliding(Boolean glide);
public void setAI(Boolean ai);

/**
* Kills the entity. In some cases, this will be equivalent to setHealth(0), but
Expand Down
4 changes: 4 additions & 0 deletions src/main/java/com/laytonsmith/abstraction/MCTeam.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
package com.laytonsmith.abstraction;

import com.laytonsmith.abstraction.enums.MCNameTagVisibility;
import com.laytonsmith.abstraction.enums.MCOption;
import com.laytonsmith.abstraction.enums.MCOptionStatus;

import java.util.Set;

Expand All @@ -15,6 +17,7 @@ public interface MCTeam {
public String getDisplayName();
public String getName();
public MCNameTagVisibility getNameTagVisibility();
public MCOptionStatus getOption(MCOption option);
public Set<String> getEntries();
public String getPrefix();
public MCScoreboard getScoreboard();
Expand All @@ -26,6 +29,7 @@ public interface MCTeam {
public void setCanSeeFriendlyInvisibles(boolean enabled);
public void setDisplayName(String displayName);
public void setNameTagVisibility(MCNameTagVisibility visibility);
public void setOption(MCOption option, MCOptionStatus status);
public void setPrefix(String prefix);
public void setSuffix(String suffix);
public void unregister();
Expand Down
16 changes: 16 additions & 0 deletions src/main/java/com/laytonsmith/abstraction/bukkit/BukkitMCTeam.java
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,16 @@
import java.util.Set;

import com.laytonsmith.abstraction.enums.MCNameTagVisibility;
import com.laytonsmith.abstraction.enums.MCOption;
import com.laytonsmith.abstraction.enums.MCOptionStatus;
import com.laytonsmith.abstraction.enums.bukkit.BukkitMCOption;
import com.laytonsmith.abstraction.enums.bukkit.BukkitMCOptionStatus;
import com.laytonsmith.abstraction.enums.bukkit.BukkitMCNameTagVisibility;
import org.bukkit.Bukkit;
import org.bukkit.OfflinePlayer;
import org.bukkit.scoreboard.NameTagVisibility;
import org.bukkit.scoreboard.Team;
import org.bukkit.scoreboard.Team.OptionStatus;

public class BukkitMCTeam implements MCTeam {

Expand Down Expand Up @@ -56,6 +61,12 @@ public MCNameTagVisibility getNameTagVisibility() {
NameTagVisibility ntv = t.getNameTagVisibility();
return BukkitMCNameTagVisibility.getConvertor().getAbstractedEnum(ntv);
}

@Override
public MCOptionStatus getOption(MCOption option) {
OptionStatus os = t.getOption(BukkitMCOption.getConvertor().getConcreteEnum(option));
return BukkitMCOptionStatus.getConvertor().getAbstractedEnum(os);
}

@Override
public Set<String> getEntries() {
Expand Down Expand Up @@ -134,6 +145,11 @@ public void setDisplayName(String displayName) {
public void setNameTagVisibility(MCNameTagVisibility visibility) {
t.setNameTagVisibility(BukkitMCNameTagVisibility.getConvertor().getConcreteEnum(visibility));
}

@Override
public void setOption(MCOption option, MCOptionStatus status) {
t.setOption(BukkitMCOption.getConvertor().getConcreteEnum(option), BukkitMCOptionStatus.getConvertor().getConcreteEnum(status));
}

@Override
public void setPrefix(String prefix) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.laytonsmith.abstraction.bukkit.entities;

import com.laytonsmith.PureUtilities.Vector3D;
import com.laytonsmith.PureUtilities.Common.ReflectionUtils;
import com.laytonsmith.abstraction.MCEntity;
import com.laytonsmith.abstraction.MCLivingEntity;
import com.laytonsmith.abstraction.MCLocation;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -206,6 +206,14 @@ private List<Block> getLineOfSight(HashSet<Short> transparent, int maxDistance,
}
return blocks;
}

@Override
public boolean hasAI() {
if(ReflectionUtils.hasMethod(le.getClass(), "hasAI", null)) { // Added in 1.9.2
return le.hasAI();
}
return true; // We'll assume the entity does have AI enabled
}

/**
* @param potionID - ID of the potion
Expand Down Expand Up @@ -373,11 +381,23 @@ public void setLeashHolder(MCEntity holder) {

@Override
public boolean isGliding() {
return le.isGliding();
if(ReflectionUtils.hasMethod(le.getClass(), "isGliding", null)) { // Added around 1.9
return le.isGliding();
}
return false;
}

@Override
public void setGliding(Boolean glide) {
le.setGliding(glide);
if(ReflectionUtils.hasMethod(le.getClass(), "setGliding", null, Boolean.class)) { // Added around 1.9
le.setGliding(glide);
}
}

@Override
public void setAI(Boolean ai) {
if(ReflectionUtils.hasMethod(le.getClass(), "setAI", null, Boolean.class)) { // Added in 1.9.2
le.setAI(ai);
}
}
}
10 changes: 10 additions & 0 deletions src/main/java/com/laytonsmith/abstraction/enums/MCOption.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package com.laytonsmith.abstraction.enums;

import com.laytonsmith.annotations.MEnum;

@MEnum("Option")
public enum MCOption {
COLLISION_RULE,
DEATH_MESSAGE_VISIBILITY,
NAME_TAG_VISIBILITY
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package com.laytonsmith.abstraction.enums;

import com.laytonsmith.annotations.MEnum;

@MEnum("OptionStatus")
public enum MCOptionStatus {
ALWAYS,
FOR_OTHER_TEAMS,
FOR_OWN_TEAM,
NEVER
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
package com.laytonsmith.abstraction.enums.bukkit;

import org.bukkit.scoreboard.Team;
import org.bukkit.scoreboard.Team.Option;

import com.laytonsmith.abstraction.Implementation;
import com.laytonsmith.abstraction.enums.EnumConvertor;
import com.laytonsmith.abstraction.enums.MCOption;
import com.laytonsmith.abstraction.enums.MCVersion;
import com.laytonsmith.annotations.abstractionenum;
import com.laytonsmith.core.Static;

@abstractionenum(
implementation= Implementation.Type.BUKKIT,
forAbstractEnum=MCOption.class,
forConcreteEnum=Team.Option.class
)
public class BukkitMCOption extends EnumConvertor<MCOption, Option>{

private static BukkitMCOption instance;

public static BukkitMCOption getConvertor() {
if (instance == null) {
instance = new BukkitMCOption();
}
return instance;
}

@Override
protected Option getConcreteEnumCustom(MCOption abstracted) {
if(Static.getServer().getMinecraftVersion().lt(MCVersion.MC1_9)) {
return null;
}
return super.getConcreteEnumCustom(abstracted);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
package com.laytonsmith.abstraction.enums.bukkit;

import org.bukkit.scoreboard.Team;
import org.bukkit.scoreboard.Team.OptionStatus;

import com.laytonsmith.abstraction.Implementation;
import com.laytonsmith.abstraction.enums.EnumConvertor;
import com.laytonsmith.abstraction.enums.MCOptionStatus;
import com.laytonsmith.abstraction.enums.MCVersion;
import com.laytonsmith.annotations.abstractionenum;
import com.laytonsmith.core.Static;

@abstractionenum(
implementation= Implementation.Type.BUKKIT,
forAbstractEnum=MCOptionStatus.class,
forConcreteEnum=Team.OptionStatus.class
)
public class BukkitMCOptionStatus extends EnumConvertor<MCOptionStatus, OptionStatus>{

private static BukkitMCOptionStatus instance;

public static BukkitMCOptionStatus getConvertor() {
if (instance == null) {
instance = new BukkitMCOptionStatus();
}
return instance;
}

@Override
protected OptionStatus getConcreteEnumCustom(MCOptionStatus abstracted) {
if(Static.getServer().getMinecraftVersion().lt(MCVersion.MC1_9)) {
return null;
}
return super.getConcreteEnumCustom(abstracted);
}
}
43 changes: 43 additions & 0 deletions src/main/java/com/laytonsmith/core/functions/EntityManagement.java
Original file line number Diff line number Diff line change
Expand Up @@ -3967,4 +3967,47 @@ public Version since() {
return CHVersion.V3_3_2;
}
}

@api
public static class get_entity_ai extends EntityGetterFunction {
public String getName() {
return "get_entity_ai";
}

public String docs() {
return "boolean {Entity} Returns true if the given entity has AI";
}

public Construct exec(Target t, Environment environment, Construct... args) throws ConfigRuntimeException {
return CBoolean.GenerateCBoolean(Static.getLivingEntity(args[0], t).hasAI(), t);
}

public Version since() {
return CHVersion.V3_3_2;
}
}

@api
public static class set_entity_ai extends EntitySetterFunction {
public String getName() {
return "set_entity_ai";
}

public String docs() {
return "void {Entity, boolean} enables or disables the entity AI";
}

public Construct exec(Target t, Environment environment, Construct... args) throws ConfigRuntimeException {
MCLivingEntity e = Static.getLivingEntity(args[0], t);
boolean ai = Static.getBoolean(args[1]);

e.setAI(ai);

return CVoid.VOID;
}

public Version since() {
return CHVersion.V3_3_2;
}
}
}
31 changes: 30 additions & 1 deletion src/main/java/com/laytonsmith/core/functions/Scoreboards.java
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@
import com.laytonsmith.abstraction.enums.MCCriteria;
import com.laytonsmith.abstraction.enums.MCDisplaySlot;
import com.laytonsmith.abstraction.enums.MCNameTagVisibility;
import com.laytonsmith.abstraction.enums.MCOption;
import com.laytonsmith.abstraction.enums.MCOptionStatus;
import com.laytonsmith.abstraction.enums.MCVersion;
import com.laytonsmith.annotations.api;
import com.laytonsmith.core.CHVersion;
Expand Down Expand Up @@ -412,11 +414,16 @@ public Construct exec(Target t, Environment environment,
if(Static.getServer().getMinecraftVersion().gte(MCVersion.MC1_8)) {
ops.set("nametagvisibility", new CString(team.getNameTagVisibility().name(), t), t);
}
if(Static.getServer().getMinecraftVersion().gte(MCVersion.MC1_9)) {
ops.set("collisionrule", new CString(team.getOption(MCOption.COLLISION_RULE).name(), t), t);
ops.set("deathmessagevisibility", new CString(team.getOption(MCOption.DEATH_MESSAGE_VISIBILITY).name(), t), t);
}
to.set("options", ops, t);
CArray pl = new CArray(t);
for (String entry : team.getEntries()) {
pl.push(new CString(entry, t), t);
}

to.set("players", pl, t);
ret.push(to, t);
}
Expand Down Expand Up @@ -1127,6 +1134,28 @@ public Construct exec(Target t, Environment environment, Construct... args) thro
}
team.setNameTagVisibility(visibility);
}
if (Static.getServer().getMinecraftVersion().gte(MCVersion.MC1_9)) {
if(options.containsKey("collisionrule")) {
MCOptionStatus collision;
try {
collision = MCOptionStatus.valueOf(options.get("collisionrule", t).val().toUpperCase());
} catch (IllegalArgumentException iae) {
throw new CREFormatException("Unknown collisionrule: "
+ options.get("collisionrule", t).val(), t);
}
team.setOption(MCOption.COLLISION_RULE, collision);
}
if(options.containsKey("deathmessagevisibility")) {
MCOptionStatus visibility;
try {
visibility = MCOptionStatus.valueOf(options.get("deathmessagevisibility", t).val().toUpperCase());
} catch (IllegalArgumentException iae) {
throw new CREFormatException("Unknown deathmessagevisibility: "
+ options.get("deathmessagevisibility", t).val(), t);
}
team.setOption(MCOption.DEATH_MESSAGE_VISIBILITY, visibility);
}
}
} else {
throw new CREFormatException("Expected arg 2 to be an array.", t);
}
Expand All @@ -1146,7 +1175,7 @@ public Integer[] numArgs() {
@Override
public String docs() {
return "void {teamName, array, [scoreboard]} Sets various options about the team from an array,"
+ " checking for keys 'friendlyfire', 'friendlyinvisibles' and 'nametagvisibility'. " + DEF_MSG;
+ " checking for keys 'friendlyfire', 'collisionrule', 'deathmessagevisibility', 'friendlyinvisibles' and 'nametagvisibility'. " + DEF_MSG;
}

@Override
Expand Down

0 comments on commit 2214521

Please sign in to comment.