From 4cfbc09f2176cf4de42eb0a8c4b370b7ec0dc1f5 Mon Sep 17 00:00:00 2001 From: Dustin Mundy Date: Sun, 16 Jul 2023 00:36:00 -0500 Subject: [PATCH 1/4] Add Interaction entity to entity_spec() --- .../bukkit/entities/BukkitMCInteraction.java | 64 +++++++++++++++++++ .../abstraction/entities/MCInteraction.java | 38 +++++++++++ .../core/functions/EntityManagement.java | 51 +++++++++++++++ 3 files changed, 153 insertions(+) create mode 100644 src/main/java/com/laytonsmith/abstraction/bukkit/entities/BukkitMCInteraction.java create mode 100644 src/main/java/com/laytonsmith/abstraction/entities/MCInteraction.java diff --git a/src/main/java/com/laytonsmith/abstraction/bukkit/entities/BukkitMCInteraction.java b/src/main/java/com/laytonsmith/abstraction/bukkit/entities/BukkitMCInteraction.java new file mode 100644 index 000000000..9e76b7492 --- /dev/null +++ b/src/main/java/com/laytonsmith/abstraction/bukkit/entities/BukkitMCInteraction.java @@ -0,0 +1,64 @@ +package com.laytonsmith.abstraction.bukkit.entities; + +import com.laytonsmith.abstraction.entities.MCInteraction; +import org.bukkit.entity.Interaction; +import org.bukkit.entity.Interaction.PreviousInteraction; + +import java.util.UUID; + +public class BukkitMCInteraction extends BukkitMCEntity implements MCInteraction { + Interaction interaction; + + public BukkitMCInteraction(Interaction i) { + super(i); + this.interaction = i; + } + + @Override + public double getWidth() { + return interaction.getWidth(); + } + + @Override + public void setWidth(double width) { + interaction.setInteractionWidth((float) width); + } + + @Override + public double getHeight() { + return interaction.getHeight(); + } + + @Override + public void setHeight(double height) { + interaction.setInteractionHeight((float) height); + } + + @Override + public boolean isResponsive() { + return interaction.isResponsive(); + } + + @Override + public void setResponsive(boolean response) { + interaction.setResponsive(response); + } + + @Override + public MCPreviousInteraction getLastAttack() { + PreviousInteraction pi = interaction.getLastAttack(); + if(pi == null) { + return null; + } + return new MCPreviousInteraction(pi.getPlayer().getUniqueId(), pi.getTimestamp()); + } + + @Override + public MCPreviousInteraction getLastInteraction() { + PreviousInteraction pi = interaction.getLastInteraction(); + if(pi == null) { + return null; + } + return new MCPreviousInteraction(pi.getPlayer().getUniqueId(), pi.getTimestamp()); + } +} diff --git a/src/main/java/com/laytonsmith/abstraction/entities/MCInteraction.java b/src/main/java/com/laytonsmith/abstraction/entities/MCInteraction.java new file mode 100644 index 000000000..39940608e --- /dev/null +++ b/src/main/java/com/laytonsmith/abstraction/entities/MCInteraction.java @@ -0,0 +1,38 @@ +package com.laytonsmith.abstraction.entities; + +import com.laytonsmith.abstraction.MCEntity; +import com.laytonsmith.abstraction.MCOfflinePlayer; +import com.laytonsmith.core.functions.PlayerManagement.player; +import org.bukkit.OfflinePlayer; + +import java.util.UUID; + +public interface MCInteraction extends MCEntity { + double getWidth(); + void setWidth(double width); + double getHeight(); + void setHeight(double height); + boolean isResponsive(); + void setResponsive(boolean response); + MCPreviousInteraction getLastAttack(); + MCPreviousInteraction getLastInteraction(); + + class MCPreviousInteraction { + private final UUID player; + private final long timestamp; + + public MCPreviousInteraction(UUID player, long timestamp) { + this.player = player; + this.timestamp = timestamp; + } + + public UUID getPlayer() { + return player; + } + + public long getTimestamp() { + return timestamp; + } + } + +} diff --git a/src/main/java/com/laytonsmith/core/functions/EntityManagement.java b/src/main/java/com/laytonsmith/core/functions/EntityManagement.java index de9f4ecc1..b165647db 100644 --- a/src/main/java/com/laytonsmith/core/functions/EntityManagement.java +++ b/src/main/java/com/laytonsmith/core/functions/EntityManagement.java @@ -52,6 +52,8 @@ import com.laytonsmith.abstraction.entities.MCHorse; import com.laytonsmith.abstraction.entities.MCHorse.MCHorseColor; import com.laytonsmith.abstraction.entities.MCHorse.MCHorsePattern; +import com.laytonsmith.abstraction.entities.MCInteraction; +import com.laytonsmith.abstraction.entities.MCInteraction.MCPreviousInteraction; import com.laytonsmith.abstraction.entities.MCIronGolem; import com.laytonsmith.abstraction.entities.MCItem; import com.laytonsmith.abstraction.entities.MCItemFrame; @@ -2249,6 +2251,30 @@ public Mixed exec(Target t, Environment environment, Mixed... args) throws Confi specArray.set(entity_spec.KEY_ZOMBIE_BREAK_DOORS, CBoolean.get(pigZombie.canBreakDoors()), t); } break; + case INTERACTION: + MCInteraction interaction = (MCInteraction) entity; + specArray.set(entity_spec.KEY_INTERACTION_WIDTH, new CDouble(interaction.getWidth(), t), t); + specArray.set(entity_spec.KEY_INTERACTION_HEIGHT, new CDouble(interaction.getHeight(), t), t); + specArray.set(entity_spec.KEY_INTERACTION_RESPONSE, CBoolean.get(interaction.isResponsive()), t); + MCPreviousInteraction attack = interaction.getLastAttack(); + if(attack != null) { + CArray attackArray = CArray.GetAssociativeArray(t); + attackArray.set("player", attack.getPlayer().toString()); + attackArray.set("timestamp", new CInt(attack.getTimestamp(), t), t); + specArray.set(entity_spec.KEY_INTERACTION_ATTACK, attackArray, t); + } else { + specArray.set(entity_spec.KEY_INTERACTION_ATTACK, CNull.NULL, t); + } + MCPreviousInteraction interact = interaction.getLastInteraction(); + if(interact != null) { + CArray interactionArray = CArray.GetAssociativeArray(t); + interactionArray.set("player", interact.getPlayer().toString()); + interactionArray.set("timestamp", new CInt(interact.getTimestamp(), t), t); + specArray.set(entity_spec.KEY_INTERACTION_INTERACTION, interactionArray, t); + } else { + specArray.set(entity_spec.KEY_INTERACTION_INTERACTION, CNull.NULL, t); + } + break; } return specArray; } @@ -2379,6 +2405,11 @@ public MSVersion since() { private static final String KEY_WOLF_COLOR = "color"; private static final String KEY_WOLF_INTERESTED = "interested"; private static final String KEY_ZOMBIE_BREAK_DOORS = "breakdoors"; + private static final String KEY_INTERACTION_WIDTH = "width"; + private static final String KEY_INTERACTION_HEIGHT = "height"; + private static final String KEY_INTERACTION_RESPONSE = "response"; + private static final String KEY_INTERACTION_ATTACK = "lastattack"; + private static final String KEY_INTERACTION_INTERACTION = "lastinteraction"; } @api(environments = {CommandHelperEnvironment.class}) @@ -3822,6 +3853,26 @@ public Mixed exec(Target t, Environment environment, Mixed... args) throws Confi } } break; + case INTERACTION: + MCInteraction interaction = (MCInteraction) entity; + for(String index : specArray.stringKeySet()) { + switch(index.toLowerCase()) { + case entity_spec.KEY_INTERACTION_HEIGHT: + interaction.setHeight(ArgumentValidation.getDouble(specArray.get(index, t), t)); + break; + case entity_spec.KEY_INTERACTION_WIDTH: + interaction.setWidth(ArgumentValidation.getDouble(specArray.get(index, t), t)); + break; + case entity_spec.KEY_INTERACTION_RESPONSE: + interaction.setResponsive(ArgumentValidation.getBooleanish(specArray.get(index, t), t)); + break; + case entity_spec.KEY_INTERACTION_ATTACK: + case entity_spec.KEY_INTERACTION_INTERACTION: + break; + default: + throwException(index, t); + } + } default: for(String index : specArray.stringKeySet()) { throwException(index, t); From a73bd9dbfb0f24927f99a25f983e3dcd8f26a5b3 Mon Sep 17 00:00:00 2001 From: Dustin Mundy Date: Sun, 16 Jul 2023 00:37:37 -0500 Subject: [PATCH 2/4] Add Interaction entity to entity_spec() --- .../abstraction/bukkit/entities/BukkitMCInteraction.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/main/java/com/laytonsmith/abstraction/bukkit/entities/BukkitMCInteraction.java b/src/main/java/com/laytonsmith/abstraction/bukkit/entities/BukkitMCInteraction.java index 9e76b7492..290eeaf5d 100644 --- a/src/main/java/com/laytonsmith/abstraction/bukkit/entities/BukkitMCInteraction.java +++ b/src/main/java/com/laytonsmith/abstraction/bukkit/entities/BukkitMCInteraction.java @@ -4,8 +4,6 @@ import org.bukkit.entity.Interaction; import org.bukkit.entity.Interaction.PreviousInteraction; -import java.util.UUID; - public class BukkitMCInteraction extends BukkitMCEntity implements MCInteraction { Interaction interaction; From 4ffba598c7966be1e925bfffb779f0c54c924805 Mon Sep 17 00:00:00 2001 From: Dustin Mundy Date: Sun, 16 Jul 2023 01:16:56 -0500 Subject: [PATCH 3/4] Add Interaction entity to entity_spec() --- .../bukkit/entities/BukkitMCInteraction.java | 5 +- .../abstraction/entities/MCInteraction.java | 3 - .../core/functions/EntityManagement.java | 89 ++++++++++--------- 3 files changed, 48 insertions(+), 49 deletions(-) diff --git a/src/main/java/com/laytonsmith/abstraction/bukkit/entities/BukkitMCInteraction.java b/src/main/java/com/laytonsmith/abstraction/bukkit/entities/BukkitMCInteraction.java index 290eeaf5d..3f75c7c7b 100644 --- a/src/main/java/com/laytonsmith/abstraction/bukkit/entities/BukkitMCInteraction.java +++ b/src/main/java/com/laytonsmith/abstraction/bukkit/entities/BukkitMCInteraction.java @@ -1,15 +1,16 @@ package com.laytonsmith.abstraction.bukkit.entities; import com.laytonsmith.abstraction.entities.MCInteraction; +import org.bukkit.entity.Entity; import org.bukkit.entity.Interaction; import org.bukkit.entity.Interaction.PreviousInteraction; public class BukkitMCInteraction extends BukkitMCEntity implements MCInteraction { Interaction interaction; - public BukkitMCInteraction(Interaction i) { + public BukkitMCInteraction(Entity i) { super(i); - this.interaction = i; + this.interaction = (Interaction) i; } @Override diff --git a/src/main/java/com/laytonsmith/abstraction/entities/MCInteraction.java b/src/main/java/com/laytonsmith/abstraction/entities/MCInteraction.java index 39940608e..bb58680ff 100644 --- a/src/main/java/com/laytonsmith/abstraction/entities/MCInteraction.java +++ b/src/main/java/com/laytonsmith/abstraction/entities/MCInteraction.java @@ -1,9 +1,6 @@ package com.laytonsmith.abstraction.entities; import com.laytonsmith.abstraction.MCEntity; -import com.laytonsmith.abstraction.MCOfflinePlayer; -import com.laytonsmith.core.functions.PlayerManagement.player; -import org.bukkit.OfflinePlayer; import java.util.UUID; diff --git a/src/main/java/com/laytonsmith/core/functions/EntityManagement.java b/src/main/java/com/laytonsmith/core/functions/EntityManagement.java index b165647db..f8e8bb39a 100644 --- a/src/main/java/com/laytonsmith/core/functions/EntityManagement.java +++ b/src/main/java/com/laytonsmith/core/functions/EntityManagement.java @@ -2039,6 +2039,30 @@ public Mixed exec(Target t, Environment environment, Mixed... args) throws Confi specArray.set(entity_spec.KEY_HORSE_ARMOR, ObjectGenerator.GetGenerator().item(horse.getArmor(), t), t); specArray.set(entity_spec.KEY_HORSE_SADDLE, ObjectGenerator.GetGenerator().item(horse.getSaddle(), t), t); break; + case INTERACTION: + MCInteraction interaction = (MCInteraction) entity; + specArray.set(entity_spec.KEY_INTERACTION_WIDTH, new CDouble(interaction.getWidth(), t), t); + specArray.set(entity_spec.KEY_INTERACTION_HEIGHT, new CDouble(interaction.getHeight(), t), t); + specArray.set(entity_spec.KEY_INTERACTION_RESPONSE, CBoolean.get(interaction.isResponsive()), t); + MCPreviousInteraction attack = interaction.getLastAttack(); + if(attack != null) { + CArray attackArray = CArray.GetAssociativeArray(t); + attackArray.set("player", attack.getPlayer().toString()); + attackArray.set("timestamp", new CInt(attack.getTimestamp(), t), t); + specArray.set(entity_spec.KEY_INTERACTION_ATTACK, attackArray, t); + } else { + specArray.set(entity_spec.KEY_INTERACTION_ATTACK, CNull.NULL, t); + } + MCPreviousInteraction interact = interaction.getLastInteraction(); + if(interact != null) { + CArray interactionArray = CArray.GetAssociativeArray(t); + interactionArray.set("player", interact.getPlayer().toString()); + interactionArray.set("timestamp", new CInt(interact.getTimestamp(), t), t); + specArray.set(entity_spec.KEY_INTERACTION_INTERACTION, interactionArray, t); + } else { + specArray.set(entity_spec.KEY_INTERACTION_INTERACTION, CNull.NULL, t); + } + break; case IRON_GOLEM: MCIronGolem golem = (MCIronGolem) entity; specArray.set(entity_spec.KEY_IRON_GOLEM_PLAYERCREATED, CBoolean.get(golem.isPlayerCreated()), t); @@ -2251,30 +2275,6 @@ public Mixed exec(Target t, Environment environment, Mixed... args) throws Confi specArray.set(entity_spec.KEY_ZOMBIE_BREAK_DOORS, CBoolean.get(pigZombie.canBreakDoors()), t); } break; - case INTERACTION: - MCInteraction interaction = (MCInteraction) entity; - specArray.set(entity_spec.KEY_INTERACTION_WIDTH, new CDouble(interaction.getWidth(), t), t); - specArray.set(entity_spec.KEY_INTERACTION_HEIGHT, new CDouble(interaction.getHeight(), t), t); - specArray.set(entity_spec.KEY_INTERACTION_RESPONSE, CBoolean.get(interaction.isResponsive()), t); - MCPreviousInteraction attack = interaction.getLastAttack(); - if(attack != null) { - CArray attackArray = CArray.GetAssociativeArray(t); - attackArray.set("player", attack.getPlayer().toString()); - attackArray.set("timestamp", new CInt(attack.getTimestamp(), t), t); - specArray.set(entity_spec.KEY_INTERACTION_ATTACK, attackArray, t); - } else { - specArray.set(entity_spec.KEY_INTERACTION_ATTACK, CNull.NULL, t); - } - MCPreviousInteraction interact = interaction.getLastInteraction(); - if(interact != null) { - CArray interactionArray = CArray.GetAssociativeArray(t); - interactionArray.set("player", interact.getPlayer().toString()); - interactionArray.set("timestamp", new CInt(interact.getTimestamp(), t), t); - specArray.set(entity_spec.KEY_INTERACTION_INTERACTION, interactionArray, t); - } else { - specArray.set(entity_spec.KEY_INTERACTION_INTERACTION, CNull.NULL, t); - } - break; } return specArray; } @@ -3159,6 +3159,27 @@ public Mixed exec(Target t, Environment environment, Mixed... args) throws Confi } } break; + case INTERACTION: + MCInteraction interaction = (MCInteraction) entity; + for(String index : specArray.stringKeySet()) { + switch(index.toLowerCase()) { + case entity_spec.KEY_INTERACTION_HEIGHT: + interaction.setHeight(ArgumentValidation.getDouble(specArray.get(index, t), t)); + break; + case entity_spec.KEY_INTERACTION_WIDTH: + interaction.setWidth(ArgumentValidation.getDouble(specArray.get(index, t), t)); + break; + case entity_spec.KEY_INTERACTION_RESPONSE: + interaction.setResponsive(ArgumentValidation.getBooleanish(specArray.get(index, t), t)); + break; + case entity_spec.KEY_INTERACTION_ATTACK: + case entity_spec.KEY_INTERACTION_INTERACTION: + break; + default: + throwException(index, t); + } + } + break; case IRON_GOLEM: MCIronGolem golem = (MCIronGolem) entity; for(String index : specArray.stringKeySet()) { @@ -3853,26 +3874,6 @@ public Mixed exec(Target t, Environment environment, Mixed... args) throws Confi } } break; - case INTERACTION: - MCInteraction interaction = (MCInteraction) entity; - for(String index : specArray.stringKeySet()) { - switch(index.toLowerCase()) { - case entity_spec.KEY_INTERACTION_HEIGHT: - interaction.setHeight(ArgumentValidation.getDouble(specArray.get(index, t), t)); - break; - case entity_spec.KEY_INTERACTION_WIDTH: - interaction.setWidth(ArgumentValidation.getDouble(specArray.get(index, t), t)); - break; - case entity_spec.KEY_INTERACTION_RESPONSE: - interaction.setResponsive(ArgumentValidation.getBooleanish(specArray.get(index, t), t)); - break; - case entity_spec.KEY_INTERACTION_ATTACK: - case entity_spec.KEY_INTERACTION_INTERACTION: - break; - default: - throwException(index, t); - } - } default: for(String index : specArray.stringKeySet()) { throwException(index, t); From dff339eaae1bec69aa2a2704f4e6cd8fc77d618a Mon Sep 17 00:00:00 2001 From: Dustin Mundy Date: Sun, 16 Jul 2023 20:02:53 -0500 Subject: [PATCH 4/4] Add Interaction entity to entity_spec() --- .../abstraction/bukkit/entities/BukkitMCInteraction.java | 4 ++-- src/main/resources/functionDocs/entity_spec | 7 +++++++ 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/laytonsmith/abstraction/bukkit/entities/BukkitMCInteraction.java b/src/main/java/com/laytonsmith/abstraction/bukkit/entities/BukkitMCInteraction.java index 3f75c7c7b..557fe1299 100644 --- a/src/main/java/com/laytonsmith/abstraction/bukkit/entities/BukkitMCInteraction.java +++ b/src/main/java/com/laytonsmith/abstraction/bukkit/entities/BukkitMCInteraction.java @@ -15,7 +15,7 @@ public BukkitMCInteraction(Entity i) { @Override public double getWidth() { - return interaction.getWidth(); + return interaction.getInteractionWidth(); } @Override @@ -25,7 +25,7 @@ public void setWidth(double width) { @Override public double getHeight() { - return interaction.getHeight(); + return interaction.getInteractionHeight(); } @Override diff --git a/src/main/resources/functionDocs/entity_spec b/src/main/resources/functionDocs/entity_spec index 59e9b9989..2245584e9 100644 --- a/src/main/resources/functionDocs/entity_spec +++ b/src/main/resources/functionDocs/entity_spec @@ -156,6 +156,13 @@ without knowing the rotations on the other axis or of other body parts beforehan * %KEY_HORSE_SADDLE%: An item pertaining to the saddle a horse has put on. Can be anything. * %KEY_HORSE_STYLE%: The horse's style (can be %HORSE_STYLE%). |- +| INTERACTION +| +* %KEY_INTERACTION_WIDTH%: "The width of the interaction's hit box on the X and Z axis." +* %KEY_INTERACTION_HEIGHT%: "The height of the interaction's hit box on the Y axis." +* %KEY_INTERACTION_RESPONSE%: "Whether vanilla responses occur such as sound and arm swing when interacting with the entity." +* %KEY_INTERACTION_ATTACK%, %KEY_INTERACTION_INTERACTION%: "An associative array containing the keys 'player' and 'timestamp' which is updated when a player attacks or right clicks the interaction respectively. 'player' is a UUID. Cannot be updated with set_entity_spec()." +|- | IRON_GOLEM | * %KEY_IRON_GOLEM_PLAYERCREATED%: Whether the iron golem was built by a player or not.