forked from MagicBane/Server
				
			
				 4 changed files with 235 additions and 0 deletions
			
			
		| @ -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 @@ | |||||||
|  | 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 @@ | |||||||
|  | // • ▌ ▄ ·.  ▄▄▄·  ▄▄ • ▪   ▄▄· ▄▄▄▄·  ▄▄▄·  ▐▄▄▄  ▄▄▄ .
 | ||||||
|  | // ·██ ▐███▪▐█ ▀█ ▐█ ▀ ▪██ ▐█ ▌▪▐█ ▀█▪▐█ ▀█ •█▌ ▐█▐▌·
 | ||||||
|  | // ▐█ ▌▐▌▐█·▄█▀▀█ ▄█ ▀█▄▐█·██ ▄▄▐█▀▀█▄▄█▀▀█ ▐█▐ ▐▌▐▀▀▀
 | ||||||
|  | // ██ ██▌▐█▌▐█ ▪▐▌▐█▄▪▐█▐█▌▐███▌██▄▪▐█▐█ ▪▐▌██▐ █▌▐█▄▄▌
 | ||||||
|  | // ▀▀  █▪▀▀▀ ▀  ▀ ·▀▀▀▀ ▀▀▀·▀▀▀ ·▀▀▀▀  ▀  ▀ ▀▀  █▪ ▀▀▀
 | ||||||
|  | //      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