From 0c25151339af17a0efc779578583cce4f0e64593 Mon Sep 17 00:00:00 2001 From: Reider745 <70357814+Reider745@users.noreply.github.com> Date: Thu, 20 Jun 2024 20:41:28 +0300 Subject: [PATCH] =?UTF-8?q?Feat:=20=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D1=8B=20=D0=BD=D0=BE=D0=B2=D1=8B=D0=B5=20=D1=82?= =?UTF-8?q?=D0=B5=D0=B3=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../entities/EntityContentFactory.java | 5 ++ .../formats/tags/ComponentsFactory.java | 4 +- .../attack/MeleeAttackComponent.java | 31 +++++++++ .../attack/NearestAttackableTarget.java | 69 +++++++++++++++++-- 4 files changed, 104 insertions(+), 5 deletions(-) create mode 100644 src/main/java/com/reider745/behavior/entities/formats/tags/components/attack/MeleeAttackComponent.java diff --git a/src/main/java/com/reider745/behavior/entities/EntityContentFactory.java b/src/main/java/com/reider745/behavior/entities/EntityContentFactory.java index 2a48b6fc..86171562 100644 --- a/src/main/java/com/reider745/behavior/entities/EntityContentFactory.java +++ b/src/main/java/com/reider745/behavior/entities/EntityContentFactory.java @@ -7,6 +7,8 @@ import cn.nukkit.level.Position; import com.reider745.behavior.entities.formats.tags.DescriptionsFactory; import com.reider745.behavior.entities.formats.tags.components.CollisionComponent; import com.reider745.behavior.entities.formats.tags.components.HealthComponent; +import com.reider745.behavior.entities.formats.tags.components.attack.MeleeAttackComponent; +import com.reider745.behavior.entities.formats.tags.components.attack.NearestAttackableTarget; import com.reider745.behavior.entities.formats.tags.components.navigation.NavigationComponentsTag; import com.reider745.behavior.entities.formats.tags.components.navigation.NavigationRandomStroll; import com.reider745.behavior.entities.formats.tags.components.navigation.NavigationWalkComponent; @@ -27,6 +29,9 @@ public class EntityContentFactory { public ArrayList navigations_compononets = new ArrayList<>(); public NavigationWalkComponent navigationWalkComponent = new NavigationWalkComponent(); + public NearestAttackableTarget nearestAttackableTarget = new NearestAttackableTarget(); + public MeleeAttackComponent meleeAttackComponent = new MeleeAttackComponent(); + public List family = new ArrayList<>(); public boolean isFireImmune = false; diff --git a/src/main/java/com/reider745/behavior/entities/formats/tags/ComponentsFactory.java b/src/main/java/com/reider745/behavior/entities/formats/tags/ComponentsFactory.java index 50b8a10c..a6bd7cb1 100644 --- a/src/main/java/com/reider745/behavior/entities/formats/tags/ComponentsFactory.java +++ b/src/main/java/com/reider745/behavior/entities/formats/tags/ComponentsFactory.java @@ -4,6 +4,7 @@ import com.reider745.behavior.entities.ComponentsTag; import com.reider745.behavior.entities.EntityContentFactory; import com.reider745.behavior.entities.TagContentFactory; import com.reider745.behavior.entities.formats.tags.components.*; +import com.reider745.behavior.entities.formats.tags.components.attack.MeleeAttackComponent; import com.reider745.behavior.entities.formats.tags.components.attack.NearestAttackableTarget; import com.reider745.behavior.entities.formats.tags.components.navigation.NavigationRandomStroll; import com.reider745.behavior.entities.formats.tags.components.navigation.NavigationWalkComponent; @@ -37,6 +38,7 @@ public class ComponentsFactory extends TagContentFactory { add(new AttackComponent()); add(new NearestAttackableTarget()); + add(new MeleeAttackComponent()); } @Override @@ -51,7 +53,7 @@ public class ComponentsFactory extends TagContentFactory { final String key = it.next(); final ComponentsTag tag = tags.get(key); if(tag == null){ - //Logger.warning("Not support ComponentsFactory "+key); + Logger.warning("Not support ComponentsFactory "+key); continue; } diff --git a/src/main/java/com/reider745/behavior/entities/formats/tags/components/attack/MeleeAttackComponent.java b/src/main/java/com/reider745/behavior/entities/formats/tags/components/attack/MeleeAttackComponent.java new file mode 100644 index 00000000..57249629 --- /dev/null +++ b/src/main/java/com/reider745/behavior/entities/formats/tags/components/attack/MeleeAttackComponent.java @@ -0,0 +1,31 @@ +package com.reider745.behavior.entities.formats.tags.components.attack; + +import com.reider745.behavior.entities.ComponentsTag; +import com.reider745.behavior.entities.EntityContentFactory; +import com.zhekasmirnov.horizon.runtime.logger.Logger; +import org.json.JSONObject; + +public class MeleeAttackComponent extends ComponentsTag { + public int priority; + public float speed_multiplier; + public boolean track_target; + + @Override + public String getNameTag() { + return "minecraft:behavior.melee_attack"; + } + + @Override + public void load(EntityContentFactory factory, Object json) { + if(json instanceof JSONObject object){ + MeleeAttackComponent component = new MeleeAttackComponent(); + + component.priority = object.optInt("priority", priority); + component.speed_multiplier = object.optFloat("speed_multiplier", speed_multiplier); + component.track_target = object.optBoolean("track_target", track_target); + + factory.meleeAttackComponent = component; + }else + Logger.warning("Not support MeleeAttackComponent "+json.getClass()); + } +} diff --git a/src/main/java/com/reider745/behavior/entities/formats/tags/components/attack/NearestAttackableTarget.java b/src/main/java/com/reider745/behavior/entities/formats/tags/components/attack/NearestAttackableTarget.java index 6eed4bb4..4088a97a 100644 --- a/src/main/java/com/reider745/behavior/entities/formats/tags/components/attack/NearestAttackableTarget.java +++ b/src/main/java/com/reider745/behavior/entities/formats/tags/components/attack/NearestAttackableTarget.java @@ -1,21 +1,82 @@ package com.reider745.behavior.entities.formats.tags.components.attack; import cn.nukkit.entity.Entity; +import com.reider745.behavior.api.VanillaMobsFamily; import com.reider745.behavior.entities.ComponentsTag; import com.reider745.behavior.entities.EntityContentFactory; +import com.zhekasmirnov.horizon.runtime.logger.Logger; +import org.json.JSONArray; +import org.json.JSONObject; + +import java.util.ArrayList; public class NearestAttackableTarget extends ComponentsTag { + public interface Condition { + boolean test(Entity entity); + } + + private static class IsFamilyCondition implements Condition { + private final String other, value; + + public IsFamilyCondition(JSONObject obj){ + other = obj.getString("subject"); + value = obj.getString("value"); + } + + @Override + public boolean test(Entity entity) { + switch (other){ + case "other" -> { + return VanillaMobsFamily.getFor(entity.getNetworkId()).contains(this.value); + } + } + throw new RuntimeException("not support NearestAttackableTarget.IsFamilyCondition"); + } + } + + public static class Filters { + public int max_dist; + public int attack_interval ; + public ArrayList filters = new ArrayList<>(); + + public Filters(JSONObject json){ + max_dist = json.getInt("max_dist"); + attack_interval = json.getInt("attack_interval"); + + final JSONArray any_of = json.getJSONObject("filters").getJSONArray("any_of"); + for(int i = 0;i < any_of.length();i++){ + JSONObject condition = any_of.getJSONObject(i); + + switch (condition.getString("test")){ + case "is_family" -> + filters.add(new IsFamilyCondition(condition)); + default -> + throw new RuntimeException("Not support NearestAttackableTarget.Filters"); + } + } + } + } + + public int priority = 1; + public ArrayList list = new ArrayList<>(); + @Override public String getNameTag() { return "minecraft:behavior.nearest_attackable_target"; } - private interface Condition { - boolean test(Entity entity); - } - @Override public void load(EntityContentFactory factory, Object json) { + if(json instanceof JSONObject object){ + NearestAttackableTarget self = new NearestAttackableTarget(); + self.priority = object.getInt("priority"); + final JSONArray entity_types = object.getJSONArray("entity_types"); + for(int i = 0;i < entity_types.length();i++) + self.list.add(new Filters(entity_types.getJSONObject(i))); + + factory.nearestAttackableTarget = self; + }else + Logger.warning("Not support NearestAttackableTarget "+json.getClass()); } }