4 changed files with 235 additions and 0 deletions
			
			
		@ -0,0 +1,61 @@
				@@ -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<PlayerCharacter> participants; | 
				
			||||
    public int maxPerGuild; | 
				
			||||
    public Vector3fImmutable entrance; | 
				
			||||
    public ArrayList<Mob> 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(); | 
				
			||||
        } | 
				
			||||
    } | 
				
			||||
} | 
				
			||||
@ -0,0 +1,103 @@
				@@ -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<Dungeon> 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<AbstractWorldObject> 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(); | 
				
			||||
            } | 
				
			||||
 | 
				
			||||
        } | 
				
			||||
    } | 
				
			||||
} | 
				
			||||
@ -0,0 +1,70 @@
				@@ -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'"; | 
				
			||||
    } | 
				
			||||
 | 
				
			||||
} | 
				
			||||
					Loading…
					
					
				
		Reference in new issue