Skip to content

Commit

Permalink
Merge branch 'master' of github.com:EngineHub/CommandHelper
Browse files Browse the repository at this point in the history
  • Loading branch information
LadyCailin committed Nov 7, 2018
2 parents 714e64a + 9e883ea commit 5453b91
Show file tree
Hide file tree
Showing 15 changed files with 317 additions and 44 deletions.
19 changes: 19 additions & 0 deletions azure-pipelines.yml
@@ -0,0 +1,19 @@
# Maven
# Build your Java project and run tests with Apache Maven.
# Add steps that analyze code, save build artifacts, deploy, and more:
# https://docs.microsoft.com/azure/devops/pipelines/languages/java

pool:
vmImage: 'Ubuntu 16.04'

steps:
- task: Maven@3
inputs:
mavenPomFile: 'pom.xml'
mavenOptions: '-Xmx3072m'
javaHomeOption: 'JDKVersion'
jdkVersionOption: '1.8'
jdkArchitectureOption: 'x64'
publishJUnitResults: false
testResultsFiles: '**/TEST-*.xml'
goals: 'package'
@@ -0,0 +1,71 @@
package com.laytonsmith.PureUtilities.Common;

/**
*
* @author Cailin
*/
public class ByteArrayUtils {

private final boolean useUpper;
private static final String MIDDLE_UPPER = " X0 X1 X2 X3 X4 X5 X6 X7 X8 X9 XA XB XC XD XE XF ";
private static final String MIDDLE_LOWER = " x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xa xb xc xd xe xf ";

/**
* Creates a new ByteArrayUtils object with default options
*/
public ByteArrayUtils() {
useUpper = true;
}

public ByteArrayUtils(boolean useUpperCase) {
this.useUpper = useUpperCase;
}

public String baToHexTable(byte[] ba) {
StringBuilder b = new StringBuilder();
StringBuilder c1 = new StringBuilder();
StringBuilder c2 = new StringBuilder();
b.append("Address |").append(useUpper ? MIDDLE_UPPER : MIDDLE_LOWER).append("| ASCII |\n");
for(int i = 0; i < ba.length + (16 - (ba.length % 16)); i++) {
if(i % 16 == 0) {
// First line, the address
b.append(String.format("0x%07" + (useUpper ? "X" : "x"), i / 16)).append(useUpper ? "X " : "x ");
}
if(i < ba.length) {
byte by = ba[i];
c1.append(toHex(by)).append(" ");
char w = '.';
if(by != 0) {
w = (char) by;
}
if(Character.isISOControl(by)) {
w = '.';
}
c2.append(w);
} else {
c1.append(".. ");
c2.append(".");
}
if(i % 16 == 15) {
// End of line, construct line
b.append("| ").append(c1.toString()).append("| ")
.append(c2.toString()).append(" |\n");
c1 = new StringBuilder();
c2 = new StringBuilder();
}
}
return b.toString();
}

private static final char[] UPPER_HEX_ARRAY = "0123456789ABCDEF".toCharArray();
private static final char[] LOWER_HEX_ARRAY = "0123456789abcdef".toCharArray();

private String toHex(byte b) {
int v = b & 0xFF;
if(useUpper) {
return new String(new char[]{UPPER_HEX_ARRAY[v >>> 4], UPPER_HEX_ARRAY[v & 0x0F]});
} else {
return new String(new char[]{LOWER_HEX_ARRAY[v >>> 4], LOWER_HEX_ARRAY[v & 0x0F]});
}
}
}
2 changes: 1 addition & 1 deletion src/main/java/com/laytonsmith/abstraction/MCEntity.java
Expand Up @@ -25,7 +25,7 @@ public interface MCEntity extends MCMetadatable {

List<MCEntity> getNearbyEntities(double x, double y, double z);

MCEntity getPassenger();
List<MCEntity> getPassengers();

MCServer getServer();

Expand Down
2 changes: 2 additions & 0 deletions src/main/java/com/laytonsmith/abstraction/MCServer.java
Expand Up @@ -22,6 +22,8 @@ public interface MCServer extends AbstractionObject {

MCPluginManager getPluginManager();

MCPlayer getPlayerExact(String name);

MCPlayer getPlayer(String name);

MCPlayer getPlayer(UUID uuid);
Expand Down
5 changes: 5 additions & 0 deletions src/main/java/com/laytonsmith/abstraction/MCTeam.java
@@ -1,5 +1,6 @@
package com.laytonsmith.abstraction;

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

Expand Down Expand Up @@ -29,6 +30,8 @@ public interface MCTeam {

String getSuffix();

MCChatColor getColor();

boolean hasEntry(String entry);

boolean removeEntry(String entry);
Expand All @@ -45,5 +48,7 @@ public interface MCTeam {

void setSuffix(String suffix);

void setColor(MCChatColor color);

void unregister();
}
Expand Up @@ -44,7 +44,7 @@ public MCItemStack getInput() {

@Override
public void setInput(MCItemStack input) {
fr.setInput(((ItemStack) input.getHandle()).getData());
fr.setInput(((ItemStack) input.getHandle()).getType());
}

@Override
Expand Down
Expand Up @@ -172,6 +172,16 @@ public MCPluginManager getPluginManager() {
return new BukkitMCPluginManager(s.getPluginManager());
}

@Override
@SuppressWarnings("deprecation")
public MCPlayer getPlayerExact(String name) {
Player p = s.getPlayerExact(name);
if(p == null) {
return null;
}
return new BukkitMCPlayer(p);
}

@Override
@SuppressWarnings("deprecation")
public MCPlayer getPlayer(String name) {
Expand Down
12 changes: 12 additions & 0 deletions src/main/java/com/laytonsmith/abstraction/bukkit/BukkitMCTeam.java
Expand Up @@ -2,8 +2,10 @@

import com.laytonsmith.abstraction.MCScoreboard;
import com.laytonsmith.abstraction.MCTeam;
import com.laytonsmith.abstraction.enums.MCChatColor;
import com.laytonsmith.abstraction.enums.MCOption;
import com.laytonsmith.abstraction.enums.MCOptionStatus;
import com.laytonsmith.abstraction.enums.bukkit.BukkitMCChatColor;
import com.laytonsmith.abstraction.enums.bukkit.BukkitMCOption;
import com.laytonsmith.abstraction.enums.bukkit.BukkitMCOptionStatus;
import org.bukkit.scoreboard.Team;
Expand Down Expand Up @@ -78,6 +80,11 @@ public String getSuffix() {
return t.getSuffix();
}

@Override
public MCChatColor getColor() {
return BukkitMCChatColor.getConvertor().getAbstractedEnum(t.getColor());
}

@Override
public boolean hasEntry(String entry) {
return t.hasEntry(entry);
Expand Down Expand Up @@ -118,6 +125,11 @@ public void setSuffix(String suffix) {
t.setSuffix(suffix);
}

@Override
public void setColor(MCChatColor color) {
t.setColor(BukkitMCChatColor.getConvertor().getConcreteEnum(color));
}

@Override
public void unregister() {
t.unregister();
Expand Down
Expand Up @@ -105,12 +105,12 @@ public List<MCEntity> getNearbyEntities(double x, double y, double z) {
}

@Override
public MCEntity getPassenger() {
List<Entity> passengers = e.getPassengers();
if(passengers.isEmpty()) {
return null;
public List<MCEntity> getPassengers() {
List<MCEntity> passengers = new ArrayList<>();
for(Entity passenger : e.getPassengers()) {
passengers.add(BukkitConvertor.BukkitGetCorrectEntity(passenger));
}
return BukkitConvertor.BukkitGetCorrectEntity(passengers.get(0));
return passengers;
}

@Override
Expand Down
2 changes: 1 addition & 1 deletion src/main/java/com/laytonsmith/core/ObjectGenerator.java
Expand Up @@ -225,7 +225,7 @@ public MCLocation location(Construct c, MCWorld w, Target t) {
* @return An item array or CNull
*/
public Construct item(MCItemStack is, Target t) {
if(is.isEmpty()) {
if(is == null || is.isEmpty()) {
return CNull.NULL;
}

Expand Down
Expand Up @@ -45,6 +45,7 @@

import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.UUID;
Expand Down Expand Up @@ -465,9 +466,9 @@ public boolean matches(Map<String, Construct> prefilter, BindableEvent e) throws
}

Prefilters.match(prefilter, "vehicletype", event.getVehicle().getType().name(), PrefilterType.MACRO);
MCEntity passenger = event.getVehicle().getPassenger();
if(passenger != null) {
Prefilters.match(prefilter, "passengertype", passenger.getType().name(), PrefilterType.MACRO);
List<MCEntity> passengers = event.getVehicle().getPassengers();
if(!passengers.isEmpty()) {
Prefilters.match(prefilter, "passengertype", passengers.get(0).getType().name(), PrefilterType.MACRO);
}

return true;
Expand Down Expand Up @@ -500,21 +501,21 @@ public Map<String, Construct> evaluate(BindableEvent event) throws EventExceptio
ret.put("vehicletype", new CString(e.getVehicle().getType().name(), t));
ret.put("id", new CString(e.getVehicle().getUniqueId().toString(), t));

MCEntity passenger = e.getVehicle().getPassenger();
List<MCEntity> passengers = e.getVehicle().getPassengers();

if(passenger == null) {
if(passengers.isEmpty()) {
ret.put("passenger", CNull.NULL);
ret.put("passengertype", CNull.NULL);
ret.put("player", CNull.NULL);
} else {

MCEntityType<?> passengertype = e.getVehicle().getPassenger().getType();
MCEntity passenger = passengers.get(0);
MCEntityType<?> passengertype = passenger.getType();

ret.put("passengertype", new CString(passengertype.name(), t));
ret.put("passenger", new CString(passenger.getUniqueId().toString(), t));

if(passengertype.getAbstracted() == MCEntityType.MCVanillaEntityType.PLAYER) {
ret.put("player", new CString(((MCPlayer) e.getVehicle().getPassenger()).getName(), t));
ret.put("player", new CString(((MCPlayer) passenger).getName(), t));
} else {
ret.put("player", CNull.NULL);
}
Expand Down
113 changes: 113 additions & 0 deletions src/main/java/com/laytonsmith/core/functions/ArrayHandling.java
Expand Up @@ -3209,6 +3209,119 @@ public ExampleScript[] examples() throws ConfigCompileException {
}


}

@api
public static class array_subset_of extends AbstractFunction {

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

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

@Override
public Integer[] numArgs() {
return new Integer[]{2};
}

@Override
public Class<? extends CREThrowable>[] thrown() {
return new Class[]{CREIllegalArgumentException.class};
}

@Override
public String docs() {
return "boolean {array, array} "
+ "Returns true if first array is a subset of second array.";
}

@Override
public boolean isRestricted() {
return false;
}

@Override
public Boolean runAsync() {
return null;
}

@Override
public Construct exec(Target t, Environment environment, Construct... args) throws ConfigRuntimeException {
Construct constA = args[0];
Construct constB = args[1];
if(!(constA instanceof CArray)) {
throw new CREIllegalArgumentException("Expecting an array, but received " + constA, t);
}
if(!(constB instanceof CArray)) {
throw new CREIllegalArgumentException("Expecting an array, but received " + constB, t);
}
return CBoolean.get(subsetOf(constA, constB, t));
}

@Override
public ExampleScript[] examples() throws ConfigCompileException {
return new ExampleScript[]{
new ExampleScript("Basic usage",
"@arrayA = array(0, 1)\n"
+ "@arrayB = array(0, 1, 5, 9)\n"
+ "array_subset_of(@arrayA, @arrayB)"),
new ExampleScript("Basic usage",
"@arrayA = array(0, 1)\n"
+ "@arrayB = array(0, 2, 5, 9)\n"
+ "array_subset_of(@arrayA, @arrayB)"),
new ExampleScript("Mix array",
"@arrayA = array(a: 1, b: array(one, two))\n"
+ "@arrayB = array(a: 1, b: array(one, two, three), c: 3)\n"
+ "array_subset_of(@arrayA, @arrayB)"),
new ExampleScript("Mix array",
"@arrayA = array(a: 1, b: array(one, two))\n"
+ "@arrayB = array(a: 1, b: array(two, one, three), c: 3)\n"
+ "array_subset_of(@arrayA, @arrayB)")
};
}

public boolean subsetOf(Construct constA, Construct constB, Target t) {
if(constA.getCType() != constB.getCType()) {
return false;
}
if(constA instanceof CArray) {
CArray arrA = (CArray) constA;
CArray arrB = (CArray) constB;
if(arrA.isAssociative() != arrB.isAssociative()) {
return false;
}
if(arrA.isAssociative()) {
for(String key : arrA.stringKeySet()) {
if(!arrB.containsKey(key)) {
return false;
}
Construct eltA = arrA.get(key, t);
Construct eltB = arrB.get(key, t);
if(!subsetOf(eltA, eltB, t)) {
return false;
}
}
} else {
for(int i = 0; i < arrA.size(); i++) {
if(!arrB.containsKey(i)) {
return false;
}
Construct eltA = arrA.get(i, t);
Construct eltB = arrB.get(i, t);
if(!subsetOf(eltA, eltB, t)) {
return false;
}
}
}
} else if(!equals.doEquals(constA, constB)) {
return false;
}
return true;
}
}
}

0 comments on commit 5453b91

Please sign in to comment.