package admincommands; import java.util.Iterator; import com.aionemu.gameserver.geoEngine.collision.CollisionIntention; import com.aionemu.gameserver.geoEngine.collision.CollisionResult; import com.aionemu.gameserver.geoEngine.collision.CollisionResults; import com.aionemu.gameserver.model.gameobjects.VisibleObject; import com.aionemu.gameserver.model.gameobjects.player.Player; import com.aionemu.gameserver.model.templates.spawns.SpawnTemplate; import com.aionemu.gameserver.network.aion.serverpackets.SM_SYSTEM_MESSAGE; import com.aionemu.gameserver.spawnengine.SpawnEngine; import com.aionemu.gameserver.utils.PacketSendUtility; import com.aionemu.gameserver.utils.chathandlers.AdminCommand; import com.aionemu.gameserver.world.geo.GeoService; /** * @author Rolandas */ public class Collide extends AdminCommand { public Collide() { super("collide", "Geo debugging tool."); // @formatter:off setSyntaxInfo( " - Lists collisions between your target and the ground.", "me - Lists collisions between you and your target." ); // @formatter:on } @Override public void execute(Player admin, String... params) { boolean isMe = false; if (params.length > 0 && !(isMe = "me".equalsIgnoreCase(params[0]))) { sendInfo(admin); return; } VisibleObject target = admin.getTarget(); if (target == null) { PacketSendUtility.sendPacket(admin, SM_SYSTEM_MESSAGE.STR_INVALID_TARGET()); return; } final byte intentions = CollisionIntention.PHYSICAL.getId(); float x = target.getX(); float y = target.getY(); float z = target.getZ(); float targetX, targetY, targetZ; if (!isMe) { targetX = x; targetY = y; targetZ = z - 10; } else { targetX = admin.getX(); targetY = admin.getY(); targetZ = admin.getZ() + admin.getObjectTemplate().getBoundRadius().getUpper() / 6; sendInfo(admin, "From target towards you:"); } sendInfo(admin, "Target: X=" + x + "; Y=" + y + "; Z=" + z); CollisionResults results = GeoService.getInstance().getCollisions(target, targetX, targetY, targetZ, intentions, null); CollisionResult closest = results.getClosestCollision(); if (results.size() == 0) { sendInfo(admin, "No collisions found."); closest = null; } else { listCollisions(admin, results, closest); } CollisionResult closestOpposite = null; if (isMe) { sendInfo(admin, "From you towards your target:"); sendInfo(admin, "Admin: X=" + admin.getX() + "; Y=" + admin.getY() + "; Z=" + admin.getZ()); results = GeoService.getInstance().getCollisions(admin, target.getX(), target.getY(), target.getZ() + target.getObjectTemplate().getBoundRadius().getUpper() / 2, intentions, null); closestOpposite = results.getClosestCollision(); if (results.size() == 0) { sendInfo(admin, "No collisions found."); closestOpposite = null; } else { listCollisions(admin, results, closestOpposite); } } if (!isMe && closest != null && closest.getContactPoint().z + 0.5f < target.getZ()) { sendInfo(admin, "Closest collision is below target's Z coordinate!"); } else { if (closest != null) { SpawnTemplate spawn = SpawnEngine.newSpawn(admin.getWorldId(), 200000, closest.getContactPoint().x, closest.getContactPoint().y, closest.getContactPoint().z, (byte) 0, 0); SpawnEngine.spawnObject(spawn, admin.getInstanceId()); } if (closestOpposite != null) { SpawnTemplate spawn = SpawnEngine.newSpawn(admin.getWorldId(), 200000, closestOpposite.getContactPoint().x, closestOpposite.getContactPoint().y, closestOpposite.getContactPoint().z, (byte) 0, 0); SpawnEngine.spawnObject(spawn, admin.getInstanceId()); } } } private void listCollisions(Player admin, CollisionResults results, CollisionResult closestOpposite) { int count = 1; int closestId = 0; String description = ""; for (Iterator iter = results.iterator(); iter.hasNext(); count++) { CollisionResult result = iter.next(); if (result.equals(closestOpposite)) closestId = count; if (result.getGeometry() == null) description += count + ". " + result.getContactPoint().toString() + "\n"; else { if (result.getGeometry().getName() == null) { description += count + ". " + result.getContactPoint().toString() + "; parent=" + result.getGeometry().getParent().getName() + "\n"; } else description += count + ". " + result.getContactPoint().toString() + "; name=" + result.getGeometry().getName() + "\n"; } } description += "-----------------------\nClosest: " + closestId + ". Distance: " + closestOpposite.getDistance(); sendInfo(admin, description); } }