mirror of
https://github.com/ProjectSWGCore/Holocore.git
synced 2026-10-07 22:13:40 -04:00
Added path waypoints for patrol routes when clicking on the spawner or patrol waypoint
This commit is contained in:
+3
-1
@@ -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<String, ServerAttribute> KEY_LOOKUP = new EnumLookup<>(ServerAttribute.class, ServerAttribute::getKey);
|
||||
|
||||
|
||||
+56
-17
@@ -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<CreatureObject> 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<ResolvedPatrolWaypoint> 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;
|
||||
|
||||
Reference in New Issue
Block a user