forked from MagicBane/Server
				
			
				 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