From 38d6ae5d2ccb86d752f7fd0a0c1bdc8bde0c00ce Mon Sep 17 00:00:00 2001 From: Obique Date: Sun, 30 Dec 2018 14:49:58 -0600 Subject: [PATCH] Added path waypoints for patrol routes when clicking on the spawner or patrol waypoint --- .../support/objects/swg/ServerAttribute.java | 4 +- .../support/npc/spawn/SpawnerService.java | 73 ++++++++++++++----- 2 files changed, 59 insertions(+), 18 deletions(-) diff --git a/src/main/java/com/projectswg/holocore/resources/support/objects/swg/ServerAttribute.java b/src/main/java/com/projectswg/holocore/resources/support/objects/swg/ServerAttribute.java index 7d7d5a4e1..5641a4d80 100644 --- a/src/main/java/com/projectswg/holocore/resources/support/objects/swg/ServerAttribute.java +++ b/src/main/java/com/projectswg/holocore/resources/support/objects/swg/ServerAttribute.java @@ -27,12 +27,14 @@ package com.projectswg.holocore.resources.support.objects.swg; +import com.projectswg.holocore.resources.support.npc.spawn.Spawner; import me.joshlarson.jlcommon.data.EnumLookup; import java.util.function.Function; public enum ServerAttribute { - PCD_PET_TEMPLATE ("pcd.pet.template", String.class, s -> s, s -> s); + PCD_PET_TEMPLATE ("pcd.pet.template", String.class, s -> s, s -> s), + EGG_SPAWNER ("egg.spawner", Spawner.class, s -> null, s -> null); private static final EnumLookup KEY_LOOKUP = new EnumLookup<>(ServerAttribute.class, ServerAttribute::getKey); diff --git a/src/main/java/com/projectswg/holocore/services/support/npc/spawn/SpawnerService.java b/src/main/java/com/projectswg/holocore/services/support/npc/spawn/SpawnerService.java index 20316db5b..df8e4b3d2 100644 --- a/src/main/java/com/projectswg/holocore/services/support/npc/spawn/SpawnerService.java +++ b/src/main/java/com/projectswg/holocore/services/support/npc/spawn/SpawnerService.java @@ -27,6 +27,12 @@ package com.projectswg.holocore.services.support.npc.spawn; import com.projectswg.common.data.location.Location; +import com.projectswg.common.network.packets.SWGPacket; +import com.projectswg.common.network.packets.swg.zone.CreateClientPathMessage; +import com.projectswg.common.network.packets.swg.zone.DestroyClientPathMessage; +import com.projectswg.common.network.packets.swg.zone.object_controller.IntendedTarget; +import com.projectswg.holocore.intents.support.global.network.InboundPacketIntent; +import com.projectswg.holocore.intents.support.global.zone.PlayerEventIntent; import com.projectswg.holocore.intents.support.objects.swg.DestroyObjectIntent; import com.projectswg.holocore.intents.support.objects.swg.ObjectCreatedIntent; import com.projectswg.holocore.resources.support.data.config.ConfigFile; @@ -34,6 +40,8 @@ import com.projectswg.holocore.resources.support.data.server_info.DataManager; import com.projectswg.holocore.resources.support.data.server_info.StandardLog; import com.projectswg.holocore.resources.support.data.server_info.loader.DataLoader; import com.projectswg.holocore.resources.support.data.server_info.loader.NpcStaticSpawnLoader.StaticSpawnInfo; +import com.projectswg.holocore.resources.support.global.player.Player; +import com.projectswg.holocore.resources.support.global.player.PlayerEvent; import com.projectswg.holocore.resources.support.npc.spawn.NPCCreator; import com.projectswg.holocore.resources.support.npc.spawn.Spawner; import com.projectswg.holocore.resources.support.npc.spawn.Spawner.ResolvedPatrolWaypoint; @@ -41,23 +49,31 @@ import com.projectswg.holocore.resources.support.npc.spawn.SpawnerType; import com.projectswg.holocore.resources.support.objects.ObjectCreator; import com.projectswg.holocore.resources.support.objects.permissions.AdminPermissions; import com.projectswg.holocore.resources.support.objects.swg.SWGObject; +import com.projectswg.holocore.resources.support.objects.swg.ServerAttribute; import com.projectswg.holocore.resources.support.objects.swg.building.BuildingObject; import com.projectswg.holocore.resources.support.objects.swg.cell.Portal; +import com.projectswg.holocore.resources.support.objects.swg.creature.CreatureObject; import com.projectswg.holocore.resources.support.objects.swg.custom.AIObject; import com.projectswg.holocore.services.support.objects.ObjectStorageService.BuildingLookup; +import com.projectswg.holocore.services.support.objects.ObjectStorageService.ObjectLookup; import me.joshlarson.jlcommon.concurrency.ScheduledThreadPool; import me.joshlarson.jlcommon.control.IntentHandler; import me.joshlarson.jlcommon.control.Service; import me.joshlarson.jlcommon.log.Log; import java.util.List; +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; +import java.util.stream.Collectors; public final class SpawnerService extends Service { private final ScheduledThreadPool executor; + private final Set adminsWithRoutes; public SpawnerService() { this.executor = new ScheduledThreadPool(1, "spawner-service"); + this.adminsWithRoutes = ConcurrentHashMap.newKeySet(); } @Override @@ -76,6 +92,36 @@ public final class SpawnerService extends Service { return true; } + @IntentHandler + private void handleInboundPacketIntent(InboundPacketIntent ipi) { + CreatureObject player = ipi.getPlayer().getCreatureObject(); + SWGPacket packet = ipi.getPacket(); + if (!(packet instanceof IntendedTarget) || player == null) + return; + long intendedTargetId = ((IntendedTarget) packet).getTargetId(); + SWGObject intendedTarget = ObjectLookup.getObjectById(intendedTargetId); + if (intendedTarget == null && adminsWithRoutes.remove(player)) { + player.sendSelf(new DestroyClientPathMessage()); + } else if (intendedTarget != null && player.hasAbility("admin")) { + Spawner spawner = (Spawner) intendedTarget.getServerAttribute(ServerAttribute.EGG_SPAWNER); + if (spawner != null) { + List waypoints = spawner.getPatrolRoute(); + player.sendSelf(new CreateClientPathMessage(waypoints.stream() + .map(wayp -> wayp.getParent() == null ? wayp.getLocation() : Location.builder(wayp.getLocation()).translateLocation(wayp.getParent().getWorldLocation()).build()) + .map(Location::getPosition) + .collect(Collectors.toList()))); + adminsWithRoutes.add(player); + } + } + } + + @IntentHandler + private void handlePlayerEventIntent(PlayerEventIntent pei) { + CreatureObject player = pei.getPlayer().getCreatureObject(); + if (pei.getEvent() == PlayerEvent.PE_LOGGED_OUT && player != null && adminsWithRoutes.remove(player)) + player.sendSelf(new DestroyClientPathMessage()); + } + @IntentHandler private void handleDestroyObjectIntent(DestroyObjectIntent doi) { SWGObject destroyedObject = doi.getObject(); @@ -108,21 +154,10 @@ public final class SpawnerService extends Service { StandardLog.onEndLoad(count, "spawners", startTime); } - private static Location buildPortalLocation(Portal portal) { - return Location.builder() - .setX(average(portal.getFrame1().getX(), portal.getFrame2().getX())) - .setY(average(portal.getFrame1().getY(), portal.getFrame2().getY())) - .setZ(average(portal.getFrame1().getZ(), portal.getFrame2().getZ())) - .setTerrain(portal.getCell1().getTerrain()) - .build(); - } - - private static double average(double x, double y) { - return (x+y) / 2; - } - private void spawn(StaticSpawnInfo spawn) { - Spawner spawner = new Spawner(spawn, createEgg(spawn)); + SWGObject egg = createEgg(spawn); + Spawner spawner = new Spawner(spawn, egg); + egg.setServerAttribute(ServerAttribute.EGG_SPAWNER, spawner); for (int i = 0; i < spawner.getAmount(); i++) { NPCCreator.createNPC(spawner); @@ -133,20 +168,24 @@ public final class SpawnerService extends Service { for (ResolvedPatrolWaypoint waypoint : patrolRoute) { SWGObject obj = ObjectCreator.createObjectFromTemplate("object/tangible/ground_spawning/patrol_waypoint.iff"); obj.setContainerPermissions(AdminPermissions.getPermissions()); + obj.setServerAttribute(ServerAttribute.EGG_SPAWNER, spawner); //noinspection HardcodedLineSeparator - obj.setObjectName("G: " + waypoint.getGroupId() + "\nP: " + waypoint.getPatrolId() + "\nNPC: " + spawn.getNpcId()); + obj.setObjectName(String.format("P: %s\nG: %s\nNPC:%s\nID:%s", waypoint.getPatrolId(), waypoint.getGroupId(), spawn.getNpcId(), spawn.getId())); obj.moveToContainer(waypoint.getParent(), waypoint.getLocation()); ObjectCreatedIntent.broadcast(obj); } } } + @SuppressWarnings("HardcodedLineSeparator") private static SWGObject createEgg(StaticSpawnInfo spawn) { SpawnerType spawnerType = SpawnerType.valueOf(spawn.getSpawnerType()); SWGObject egg = ObjectCreator.createObjectFromTemplate(spawnerType.getObjectTemplate()); egg.setContainerPermissions(AdminPermissions.getPermissions()); - //noinspection HardcodedLineSeparator - egg.setObjectName(String.format("%s\nNPC: %s\n", spawn.getId(), spawn.getNpcId())); + if (spawn.getPatrolId().isEmpty() || spawn.getPatrolId().equals("0")) + egg.setObjectName(String.format("%s\nNPC: %s", spawn.getId(), spawn.getNpcId())); + else + egg.setObjectName(String.format("%s\nNPC: %s\nG: %s", spawn.getId(), spawn.getNpcId(), spawn.getPatrolId())); egg.systemMove(getCell(spawn.getId(), spawn.getCellId(), spawn.getBuildingId()), Location.builder().setTerrain(spawn.getTerrain()).setPosition(spawn.getX(), spawn.getY(), spawn.getZ()).setHeading(spawn.getHeading()).build()); ObjectCreatedIntent.broadcast(egg); return egg;