From a5e0396dc63bacf70332d02485a577628bbba183 Mon Sep 17 00:00:00 2001 From: FatBoy-DOTC Date: Thu, 27 Feb 2025 05:15:29 -0600 Subject: [PATCH] Dungeon System draft --- src/engine/Dungeons/Dungeon.java | 61 +++++++++++++ src/engine/Dungeons/DungeonManager.java | 103 ++++++++++++++++++++++ src/engine/devcmd/cmds/DungenonCmd.java | 70 +++++++++++++++ src/engine/gameManager/DevCmdManager.java | 1 + 4 files changed, 235 insertions(+) create mode 100644 src/engine/Dungeons/Dungeon.java create mode 100644 src/engine/Dungeons/DungeonManager.java create mode 100644 src/engine/devcmd/cmds/DungenonCmd.java diff --git a/src/engine/Dungeons/Dungeon.java b/src/engine/Dungeons/Dungeon.java new file mode 100644 index 00000000..05ec4ef2 --- /dev/null +++ b/src/engine/Dungeons/Dungeon.java @@ -0,0 +1,61 @@ +package engine.Dungeons; + +import engine.Enum; +import engine.InterestManagement.WorldGrid; +import engine.gameManager.PowersManager; +import engine.math.Vector3fImmutable; +import engine.objects.*; +import engine.powers.EffectsBase; +import engine.server.MBServerStatics; + +import java.util.ArrayList; +import java.util.HashSet; + +public class Dungeon { + + public static int NoFlyEffectID = -1733819072; + public static int NoTeleportEffectID = -1971545187; + public static int NoSummonEffectID = 2122002462; + public ArrayList participants; + public int maxPerGuild; + public Vector3fImmutable entrance; + public ArrayList dungeon_mobs; + public Long respawnTime = 0L; + + public Dungeon(Vector3fImmutable entrance, int maxCount){ + this.participants = new ArrayList<>(); + this.entrance = entrance; + this.dungeon_mobs = new ArrayList<>(); + this.maxPerGuild = maxCount; + } + public void applyDungeonEffects(PlayerCharacter player){ + EffectsBase noFly = PowersManager.getEffectByToken(NoFlyEffectID); + EffectsBase noTele = PowersManager.getEffectByToken(NoTeleportEffectID); + EffectsBase noSum = PowersManager.getEffectByToken(NoSummonEffectID); + + if(noFly != null) + player.addEffectNoTimer(noFly.getName(),noFly,40,true); + + if(noTele != null) + player.addEffectNoTimer(noTele.getName(),noTele,40,true); + + if(noSum != null) + player.addEffectNoTimer(noSum.getName(),noSum,40,true); + } + + public void removeDungeonEffects(PlayerCharacter player) { + EffectsBase noFly = PowersManager.getEffectByToken(NoFlyEffectID); + EffectsBase noTele = PowersManager.getEffectByToken(NoTeleportEffectID); + EffectsBase noSum = PowersManager.getEffectByToken(NoSummonEffectID); + for (Effect eff : player.effects.values()) { + if (noFly != null && eff.getEffectsBase().equals(noFly)) + eff.endEffect(); + + if (noTele != null && eff.getEffectsBase().equals(noTele)) + eff.endEffect(); + + if (noSum != null && eff.getEffectsBase().equals(noSum)) + eff.endEffect(); + } + } +} diff --git a/src/engine/Dungeons/DungeonManager.java b/src/engine/Dungeons/DungeonManager.java new file mode 100644 index 00000000..7792699b --- /dev/null +++ b/src/engine/Dungeons/DungeonManager.java @@ -0,0 +1,103 @@ +package engine.Dungeons; + +import engine.InterestManagement.WorldGrid; +import engine.objects.AbstractWorldObject; +import engine.objects.Guild; +import engine.objects.Mob; +import engine.objects.PlayerCharacter; +import engine.powers.EffectsBase; +import engine.server.MBServerStatics; + +import java.util.ArrayList; +import java.util.HashSet; + +public class DungeonManager { + public static ArrayList dungeons; + + private static final float dungeonAiRange = 64f; + private static final float maxTravel = 64f; + + public static void joinDungeon(PlayerCharacter pc, Dungeon dungeon){ + if(requestEnter(pc,dungeon)) { + dungeon.participants.add(pc); + dungeon.applyDungeonEffects(pc); + translocateToDungeon(pc, dungeon); + } + } + + public static void leaveDungeon(PlayerCharacter pc, Dungeon dungeon){ + dungeon.participants.remove(pc); + dungeon.removeDungeonEffects(pc); + translocateOutOfDungeon(pc); + } + + public static boolean requestEnter(PlayerCharacter pc, Dungeon dungeon){ + int current = 0; + Guild nation = pc.guild.getNation(); + + if(nation == null) + return false; + + for(PlayerCharacter participant : dungeon.participants){ + if(participant.guild.getNation().equals(nation)){ + current ++; + } + } + + if(current >= dungeon.maxPerGuild) + return false; + + return true; + } + + public static void translocateToDungeon(PlayerCharacter pc, Dungeon dungeon){ + pc.teleport(dungeon.entrance); + pc.setSafeMode(); + } + + public static void translocateOutOfDungeon(PlayerCharacter pc){ + pc.teleport(pc.bindLoc); + pc.setSafeMode(); + } + + public static void pulse_dungeons(){ + for(Dungeon dungeon : dungeons){ + + //early exit, if no players present don't waste resources + if(dungeon.participants.isEmpty()) + continue; + + if(dungeon.respawnTime > 0 && System.currentTimeMillis() > dungeon.respawnTime){ + respawnMobs(dungeon); + } + + //remove any players that have left + HashSet obj = WorldGrid.getObjectsInRangePartial(dungeon.entrance,4096f,MBServerStatics.MASK_PLAYER); + for(PlayerCharacter player : dungeon.participants) + if(!obj.contains(player)) + leaveDungeon(player,dungeon); + + //cycle dungeon mob AI + for(Mob mob : dungeon.dungeon_mobs) + dungeonMobAI(mob); + } + } + + public static void dungeonMobAI(Mob mob){ + + } + + public static void respawnMobs(Dungeon dungeon){ + for(Mob mob : dungeon.dungeon_mobs){ + + if(!mob.isAlive() && mob.despawned) + mob.respawn(); + + if(!mob.isAlive() && !mob.despawned){ + mob.despawn(); + mob.respawn(); + } + + } + } +} diff --git a/src/engine/devcmd/cmds/DungenonCmd.java b/src/engine/devcmd/cmds/DungenonCmd.java new file mode 100644 index 00000000..650a063f --- /dev/null +++ b/src/engine/devcmd/cmds/DungenonCmd.java @@ -0,0 +1,70 @@ +// • ▌ ▄ ·. ▄▄▄· ▄▄ • ▪ ▄▄· ▄▄▄▄· ▄▄▄· ▐▄▄▄ ▄▄▄ . +// ·██ ▐███▪▐█ ▀█ ▐█ ▀ ▪██ ▐█ ▌▪▐█ ▀█▪▐█ ▀█ •█▌ ▐█▐▌· +// ▐█ ▌▐▌▐█·▄█▀▀█ ▄█ ▀█▄▐█·██ ▄▄▐█▀▀█▄▄█▀▀█ ▐█▐ ▐▌▐▀▀▀ +// ██ ██▌▐█▌▐█ ▪▐▌▐█▄▪▐█▐█▌▐███▌██▄▪▐█▐█ ▪▐▌██▐ █▌▐█▄▄▌ +// ▀▀ █▪▀▀▀ ▀ ▀ ·▀▀▀▀ ▀▀▀·▀▀▀ ·▀▀▀▀ ▀ ▀ ▀▀ █▪ ▀▀▀ +// Magicbane Emulator Project © 2013 - 2022 +// www.magicbane.com + + +package engine.devcmd.cmds; + +import engine.Enum.GameObjectType; +import engine.devcmd.AbstractDevCmd; +import engine.gameManager.ChatManager; +import engine.gameManager.DbManager; +import engine.gameManager.ZoneManager; +import engine.math.Vector3fImmutable; +import engine.objects.*; +import org.pmw.tinylog.Logger; + +/** + * @author Eighty + */ +public class DungenonCmd extends AbstractDevCmd { + + public DungenonCmd() { + super("dungeon"); + } + + @Override + protected void _doCmd(PlayerCharacter pc, String[] words, + AbstractGameObject target) { + if (words.length != 1) { + this.sendUsage(pc); + return; + } + if(words.length < 1) { + throwbackInfo(pc, this._getHelpString()); + return; + } + Zone parent = ZoneManager.findSmallestZone(pc.loc); + if(parent == null) + return; + + switch(words[0]){ + case "mob": + int mobbase = Integer.parseInt(words[1]); + int level = Integer.parseInt(words[2]); + Mob.createStrongholdMob(mobbase,pc.loc,Guild.getErrantGuild(),true,parent,null,0,"",level); + break; + case "building": + int blueprint = Integer.parseInt(words[1]); + int rank = Integer.parseInt(words[2]); + int rot = Integer.parseInt(words[3]); + + break; + } + } + + @Override + protected String _getHelpString() { + return "indicate mob or building followed by an id and a level"; + } + + @Override + protected String _getUsageString() { + return "'/dungeon mob 2001 10'"; + } + +} diff --git a/src/engine/gameManager/DevCmdManager.java b/src/engine/gameManager/DevCmdManager.java index 1016bfcf..ed1cc819 100644 --- a/src/engine/gameManager/DevCmdManager.java +++ b/src/engine/gameManager/DevCmdManager.java @@ -85,6 +85,7 @@ public enum DevCmdManager { DevCmdManager.registerDevCmd(new AddBuildingCmd()); DevCmdManager.registerDevCmd(new AddNPCCmd()); DevCmdManager.registerDevCmd(new AddMobCmd()); + DevCmdManager.registerDevCmd(new DungenonCmd()); DevCmdManager.registerDevCmd(new RemoveObjectCmd()); DevCmdManager.registerDevCmd(new RotateCmd()); DevCmdManager.registerDevCmd(new FlashMsgCmd());