2025-03-16 13:48:39 -05:00
package engine.gameManager ;
import engine.Enum ;
import engine.InterestManagement.WorldGrid ;
2025-03-16 14:21:13 -05:00
import engine.net.Dispatch ;
2025-03-16 13:48:39 -05:00
import engine.net.DispatchMessage ;
2025-03-16 14:21:13 -05:00
import engine.net.client.msg.HotzoneChangeMsg ;
2025-03-16 13:48:39 -05:00
import engine.net.client.msg.chat.ChatSystemMsg ;
2025-03-16 14:21:13 -05:00
import engine.objects.* ;
2025-03-16 15:19:32 -05:00
import engine.server.MBServerStatics ;
2025-03-16 13:48:39 -05:00
import org.pmw.tinylog.Logger ;
2025-03-16 14:55:46 -05:00
import java.util.ArrayList ;
import java.util.HashMap ;
2025-03-16 15:19:32 -05:00
import java.util.HashSet ;
2025-03-16 13:48:39 -05:00
import java.util.Random ;
2025-03-16 14:21:13 -05:00
import java.util.concurrent.ThreadLocalRandom ;
2025-03-16 13:48:39 -05:00
public class HotzoneManager {
2025-03-16 14:55:46 -05:00
public static Long lastPulseTime = 0L ;
public static HashMap < Guild , ArrayList < PlayerCharacter >> playersPresent ;
2025-03-16 13:48:39 -05:00
public static Mob hotzoneMob = null ;
public static void SelectRandomHotzone (){
if ( hotzoneMob != null ){
hotzoneMob . killCharacter ( "Hotzone Over" );
2025-03-16 14:55:46 -05:00
hotzoneMob . despawn ();
hotzoneMob . spawnTime = 1000000000 ;
2025-03-16 13:48:39 -05:00
}
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 );
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 );
2025-03-16 14:21:13 -05:00
created . BehaviourType = Enum . MobBehaviourType . Aggro ;
2025-03-16 13:48:39 -05:00
hotzoneMob = created ;
2025-03-16 14:48:36 -05:00
GenerateHotzoneEpicLoot ( created );
2025-03-16 14:21:13 -05:00
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 );
}
}
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 >= 76 && 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 e ) {
}
runeBase = ItemBase . getItemBase ( itemId );
if ( runeBase != null ) {
MobLoot rune = new MobLoot ( mob , runeBase , true );
if ( rune != null )
mob . getCharItemManager (). addItemToInventory ( rune );
}
}
if ( roll >= 95 ){
//glass
int glassRoll = ThreadLocalRandom . current (). nextInt ( 1 , 101 );
if ( glassRoll < 5 ){
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 );
}
}
}
//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 );
}
2025-03-16 13:48:39 -05:00
}
2025-03-16 14:48:36 -05:00
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 );
}
}
2025-03-16 14:55:46 -05:00
public static void pulse (){
2025-03-16 15:19:32 -05:00
if ( HotzoneManager . playersPresent == null )
2025-03-16 14:55:46 -05:00
HotzoneManager . playersPresent = new HashMap <> ();
2025-03-16 15:19:32 -05:00
if ( ZoneManager . hotZone == null )
return ;
HashSet < AbstractWorldObject > inRange = WorldGrid . getObjectsInRangePartial ( ZoneManager . hotZone . getLoc (), ZoneManager . hotZone . getBounds (). getHalfExtents (). x * 2 , MBServerStatics . MASK_PLAYER );
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 ). contains ( pc )){
if ( HotzoneManager . playersPresent . get ( nation ). size () >= 5 ){
//more than 5, boot player out
pc . setLoc ( pc . bindLoc );
pc . teleport ( pc . bindLoc );
} else {
//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 );
}
2025-03-16 14:55:46 -05:00
}
}
2025-03-16 13:48:39 -05:00
}