forked from MagicBane/Server
				
			
			You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							290 lines
						
					
					
						
							12 KiB
						
					
					
				
			
		
		
	
	
							290 lines
						
					
					
						
							12 KiB
						
					
					
				| package engine.gameManager; | |
|  | |
| import engine.Enum; | |
| import engine.InterestManagement.WorldGrid; | |
| import engine.math.Vector3fImmutable; | |
| import engine.net.Dispatch; | |
| import engine.net.DispatchMessage; | |
| import engine.net.client.msg.HotzoneChangeMsg; | |
| import engine.net.client.msg.chat.ChatSystemMsg; | |
| import engine.objects.*; | |
| import engine.server.MBServerStatics; | |
| import org.pmw.tinylog.Logger; | |
|  | |
| import java.util.ArrayList; | |
| import java.util.HashMap; | |
| import java.util.HashSet; | |
| import java.util.Random; | |
| import java.util.concurrent.ThreadLocalRandom; | |
|  | |
| public class HotzoneManager { | |
|     public static Long lastPulseTime = 0L; | |
|     public static HashMap<Guild, ArrayList<PlayerCharacter>> playersPresent; | |
|     public static Mob hotzoneMob = null; | |
|     public static boolean three_quarter_health = false; | |
|     public static boolean half_health = false; | |
|     public static boolean quarter_health = false; | |
|     public static void SelectRandomHotzone(){ | |
|         if(hotzoneMob != null){ | |
|             hotzoneMob.killCharacter("Hotzone Over"); | |
|             hotzoneMob.despawn(); | |
|             hotzoneMob.spawnTime = 1000000000; | |
|             DbManager.MobQueries.DELETE_MOB( hotzoneMob); | |
|         } | |
|         Random random = new Random(); | |
|         Zone newHotzone = null; | |
|         while (newHotzone == null || newHotzone.getObjectUUID() == 931 || newHotzone.getObjectUUID() == 913) | |
|             newHotzone = (Zone) ZoneManager.macroZones.toArray()[random.nextInt(ZoneManager.macroZones.size())]; | |
|         ZoneManager.setHotZone(newHotzone); | |
|         ZoneManager.hotZone = newHotzone; | |
|         int R8UUId = 0; | |
|         switch(random.nextInt(5)) { | |
|             case 1: | |
|                 R8UUId = 14152; | |
|                 break; | |
|             case 2: | |
|                 R8UUId = 14179; | |
|                 break; | |
|             case 3: | |
|                 R8UUId = 14180; | |
|                 break; | |
|             case 4: | |
|                 R8UUId = 14220; | |
|                 break; | |
|             default: | |
|                 R8UUId = 14319; | |
|                 break; | |
|         } | |
|         Mob created = Mob.createMob(R8UUId,newHotzone.getLoc(), Guild.getErrantGuild(),true,newHotzone,null,0,"",85); | |
|         if(created == null){ | |
|             Logger.error("Failed To Generate Hotzone R8 Mob"); | |
|             return; | |
|         } | |
|         ChatSystemMsg chatMsg = new ChatSystemMsg(null, created.getFirstName() + " has spawned in " + newHotzone.getName() + ". Glory and riches await adventurers who dare defeat it!"); | |
|         chatMsg.setMessageType(10); | |
|         chatMsg.setChannel(Enum.ChatChannelType.SYSTEM.getChannelID()); | |
|         DispatchMessage.dispatchMsgToAll(chatMsg); | |
|  | |
|         created.bindLoc = newHotzone.getLoc(); | |
|         created.runAfterLoad(); | |
|         WorldGrid.addObject(created,created.bindLoc.x,created.bindLoc.z); | |
|         created.teleport(created.bindLoc); | |
|         created.BehaviourType = Enum.MobBehaviourType.Aggro; | |
|         hotzoneMob = created; | |
|         created.setHealth(100000); | |
|         created.setResists(new Resists("Dropper")); | |
|         GenerateHotzoneEpicLoot(created); | |
|         ZoneManager.hotZone = newHotzone; | |
|  | |
|         for(PlayerCharacter player : SessionManager.getAllActivePlayerCharacters()) { | |
|             HotzoneChangeMsg hcm = new HotzoneChangeMsg(Enum.GameObjectType.Zone.ordinal(), ZoneManager.hotZone.getObjectUUID()); | |
|             Dispatch dispatch = Dispatch.borrow(player, hcm); | |
|             DispatchMessage.dispatchMsgDispatch(dispatch, Enum.DispatchChannel.SECONDARY); | |
|         } | |
|         three_quarter_health = false; | |
|         half_health = false; | |
|         quarter_health = false; | |
|     } | |
|  | |
|     public static void GenerateHotzoneEpicLoot(Mob mob) { | |
|         mob.getCharItemManager().clearInventory(); | |
|         Random random = new Random(); | |
|         int roll = random.nextInt(100); | |
|         int itemId; | |
|         //ItemBase runeBase; | |
|        // if (roll >= 90) { | |
|             //35 or 40 | |
|        //     roll = ThreadLocalRandom.current().nextInt(HellgateManager.static_rune_ids_high.size() + 1); | |
|        //     itemId = HellgateManager.static_rune_ids_high.get(0); | |
|         //    try { | |
|         //        itemId = HellgateManager.static_rune_ids_high.get(roll); | |
|          //   } catch (Exception e) { | |
|  | |
|         //    } | |
|           //  runeBase = ItemBase.getItemBase(itemId); | |
|          //   if (runeBase != null) { | |
|          //       MobLoot rune = new MobLoot(mob, runeBase, true); | |
|  | |
|          //       if (rune != null) | |
|          //           mob.getCharItemManager().addItemToInventory(rune); | |
|          //   } | |
|         //} else if (roll >= 65 && roll <= 89) { | |
|             //30,35 or 40 | |
|         //    roll = ThreadLocalRandom.current().nextInt(HellgateManager.static_rune_ids_mid.size() + 1); | |
|         //    itemId = HellgateManager.static_rune_ids_mid.get(0); | |
|         //    try { | |
|         //        itemId = HellgateManager.static_rune_ids_mid.get(roll); | |
|          //   } catch (Exception e) { | |
|  | |
|         //    } | |
|         //    runeBase = ItemBase.getItemBase(itemId); | |
|         //    if (runeBase != null) { | |
|         //        MobLoot rune = new MobLoot(mob, runeBase, true); | |
|  | |
|         //        if (rune != null) | |
|         //            mob.getCharItemManager().addItemToInventory(rune); | |
|         //    } | |
|        // } else { | |
|             //5-30 | |
|        //     roll = ThreadLocalRandom.current().nextInt(HellgateManager.static_rune_ids_low.size() + 1); | |
|        //     itemId = HellgateManager.static_rune_ids_low.get(0); | |
|         //    try { | |
|         //        itemId = HellgateManager.static_rune_ids_low.get(roll); | |
|         //    } catch (Exception ignored) { | |
|  | |
|          //   } | |
|          //   runeBase = ItemBase.getItemBase(itemId); | |
|          //   if (runeBase != null) { | |
|          //       MobLoot rune = new MobLoot(mob, runeBase, true); | |
|  | |
|         //        if (rune != null) | |
|         //            mob.getCharItemManager().addItemToInventory(rune); | |
|         //    } | |
|         //} | |
|  | |
|         //wrapped rune: | |
|         ItemBase runeBase = ItemBase.getItemBase(971070); | |
|         if (runeBase != null) { | |
|             MobLoot rune = new MobLoot(mob, runeBase, true); | |
|  | |
|             if (rune != null) | |
|                 mob.getCharItemManager().addItemToInventory(rune); | |
|         } | |
|  | |
|  | |
|         roll = ThreadLocalRandom.current().nextInt(1, 101); | |
|         if (roll >= 95) { | |
|             //glass | |
|             int glassID = LootManager.rollRandomItem(126); | |
|             ItemBase glassItem = ItemBase.getItemBase(glassID); | |
|             if (glassItem != null) { | |
|                 MobLoot glass = new MobLoot(mob, glassItem, true); | |
|  | |
|                 if (glass != null) | |
|                     mob.getCharItemManager().addItemToInventory(glass); | |
|             } | |
|         } | |
|  | |
|         roll = ThreadLocalRandom.current().nextInt(1, 101); | |
|         if (roll >= 95) { | |
|             //r8 banescroll | |
|             int baneID = 910018; | |
|             ItemBase baneItem = ItemBase.getItemBase(baneID); | |
|             if (baneItem != null) { | |
|                 MobLoot bane = new MobLoot(mob, baneItem, true); | |
|  | |
|                 if (bane != null) | |
|                     mob.getCharItemManager().addItemToInventory(bane); | |
|             } | |
|         } | |
|  | |
|         roll = ThreadLocalRandom.current().nextInt(1, 101); | |
|         if (roll >= 95) { | |
|             //guard captain | |
|             roll = ThreadLocalRandom.current().nextInt(LootManager.racial_guard_uuids.size() + 1); | |
|             itemId = LootManager.racial_guard_uuids.get(0); | |
|             try { | |
|                 itemId = LootManager.racial_guard_uuids.get(roll); | |
|             } catch (Exception e) { | |
|  | |
|             } | |
|             runeBase = ItemBase.getItemBase(itemId); | |
|             if (runeBase != null) { | |
|                 MobLoot rune = new MobLoot(mob, runeBase, true); | |
|  | |
|                 if (rune != null) | |
|                     mob.getCharItemManager().addItemToInventory(rune); | |
|             } | |
|         } | |
|     } | |
|  | |
|     public static void ClearHotzone(){ | |
|         ZoneManager.hotZone = null; | |
|         for(PlayerCharacter player : SessionManager.getAllActivePlayerCharacters()) { | |
|             HotzoneChangeMsg hcm = new HotzoneChangeMsg(Enum.GameObjectType.Zone.ordinal(), 0); | |
|             Dispatch dispatch = Dispatch.borrow(player, hcm); | |
|             DispatchMessage.dispatchMsgDispatch(dispatch, Enum.DispatchChannel.SECONDARY); | |
|         } | |
|     } | |
|  | |
|     public static void pulse(){ | |
|         if(HotzoneManager.playersPresent == null) | |
|             HotzoneManager.playersPresent = new HashMap<>(); | |
|  | |
|         if(ZoneManager.hotZone == null) | |
|             return; | |
|  | |
|         if(lastPulseTime + 5000L > System.currentTimeMillis()) | |
|             return; | |
|  | |
|         lastPulseTime = System.currentTimeMillis(); | |
|  | |
|         //handle world announcements for HZ boss | |
|         if(hotzoneMob != null){ | |
|             float health = hotzoneMob.getHealth(); | |
|             if(health < 75000 && health > 50000 && !three_quarter_health){ | |
|                 //mob at 50%-75% health | |
|                 three_quarter_health = true; | |
|                 String name = hotzoneMob.getName(); | |
|                 ChatSystemMsg chatMsg = new ChatSystemMsg(null, name + " In The Hotzone Is At 75% Health"); | |
|                 chatMsg.setMessageType(10); | |
|                 chatMsg.setChannel(Enum.ChatChannelType.SYSTEM.getChannelID()); | |
|                 DispatchMessage.dispatchMsgToAll(chatMsg); | |
|             }else if(health < 50000 && health > 25000 && !half_health){ | |
|                 //mob ta 25%-50% health | |
|                 half_health = true; | |
|                 String name = hotzoneMob.getName(); | |
|                 ChatSystemMsg chatMsg = new ChatSystemMsg(null, name + " In The Hotzone Is At 50% Health"); | |
|                 chatMsg.setMessageType(10); | |
|                 chatMsg.setChannel(Enum.ChatChannelType.SYSTEM.getChannelID()); | |
|                 DispatchMessage.dispatchMsgToAll(chatMsg); | |
|             }else if(health < 25000 && !quarter_health){ | |
|                 //mob under 25% health | |
|                 quarter_health = true; | |
|                 String name = hotzoneMob.getName(); | |
|                 ChatSystemMsg chatMsg = new ChatSystemMsg(null, name + " In The Hotzone Is At 25% Health"); | |
|                 chatMsg.setMessageType(10); | |
|                 chatMsg.setChannel(Enum.ChatChannelType.SYSTEM.getChannelID()); | |
|                 DispatchMessage.dispatchMsgToAll(chatMsg); | |
|             }else if (health > 75000){ | |
|                 //mob at 75% - 100% health | |
|  | |
|             } | |
|         } | |
|  | |
|         HashSet<AbstractWorldObject> inRange = WorldGrid.getObjectsInRangePartial(ZoneManager.hotZone.getLoc(),ZoneManager.hotZone.getBounds().getHalfExtents().x * 2, MBServerStatics.MASK_PLAYER); | |
|  | |
|         //clear out old players who aren't here anymore | |
|         for(Guild nation : HotzoneManager.playersPresent.keySet()){ | |
|             for(PlayerCharacter pc : HotzoneManager.playersPresent.get(nation)){ | |
|                 if (!inRange.contains(pc)) { | |
|                     HotzoneManager.playersPresent.get(nation).remove(pc); | |
|                     if(HotzoneManager.playersPresent.get(nation).size() < 1){ | |
|                         HotzoneManager.playersPresent.remove(nation); | |
|                     } | |
|                 } | |
|             } | |
|         } | |
|  | |
|         //check status of current players/nation in vicinity | |
|         for(AbstractWorldObject awo : inRange){ | |
|             PlayerCharacter pc = (PlayerCharacter)awo; | |
|             Guild nation = pc.guild.getNation(); | |
|             if(HotzoneManager.playersPresent.containsKey(nation)){ | |
|                 //nation already here, add to list | |
|                 if(HotzoneManager.playersPresent.get(nation).size() >= 5 && !HotzoneManager.playersPresent.get(nation).contains(pc)){ | |
|                     //more than 5, boot player out | |
|                     MovementManager.translocate(pc, Vector3fImmutable.getRandomPointOnCircle(ZoneManager.getZoneByUUID(656).getLoc(),30f),Regions.GetRegionForTeleport(ZoneManager.getZoneByUUID(656).getLoc())); | |
|                 } | |
|                 if(!HotzoneManager.playersPresent.get(nation).contains(pc)){ | |
|                     //less than 5, allow player in | |
|                     HotzoneManager.playersPresent.get(nation).add(pc); | |
|                 } | |
|             }else{ | |
|                 ArrayList<PlayerCharacter> newList = new ArrayList<>(); | |
|                 newList.add(pc); | |
|                 HotzoneManager.playersPresent.put(nation,newList); | |
|             } | |
|         } | |
|     } | |
| }
 | |
| 
 |