Compare commits
602 Commits
master
...
lakebane-q
114 changed files with 6307 additions and 2266 deletions
@ -0,0 +1,131 @@
@@ -0,0 +1,131 @@
|
||||
package engine.QuestSystem; |
||||
|
||||
import engine.InterestManagement.WorldGrid; |
||||
import engine.gameManager.ChatManager; |
||||
import engine.net.client.msg.ErrorPopupMsg; |
||||
import engine.objects.*; |
||||
import engine.server.MBServerStatics; |
||||
|
||||
import java.util.ArrayList; |
||||
import java.util.HashMap; |
||||
import java.util.HashSet; |
||||
import java.util.Random; |
||||
|
||||
public class QuestManager { |
||||
public static HashMap<PlayerCharacter,QuestObject> acceptedQuests = new HashMap<>(); |
||||
public static HashMap<PlayerCharacter,ArrayList<String>> completedQuests = new HashMap<>(); |
||||
|
||||
public static boolean grantsQuest(NPC npc){ |
||||
if(npc == null) |
||||
return false; |
||||
|
||||
if(npc.contract == null) |
||||
return false; |
||||
|
||||
return npc.contract.getName().contains("ZoneLore") || npc.contract.getName().equals("Barrowlands Sentry"); |
||||
} |
||||
|
||||
public static void displayCurrentQuest(PlayerCharacter pc){ |
||||
if(acceptedQuests.containsKey(pc)){ |
||||
QuestObject obj = acceptedQuests.get(pc); |
||||
String output = "You have embarked on the noble quest: "; |
||||
output += obj.QuestName + ". "; |
||||
output += obj.description; |
||||
output += ". " + obj.objectiveCount + " / " + obj.objectiveCountRequired; |
||||
ErrorPopupMsg.sendErrorMsg(pc, output); |
||||
}else{ |
||||
ErrorPopupMsg.sendErrorMsg(pc, "You have no active quest."); |
||||
} |
||||
} |
||||
|
||||
public static void acceptQuest(PlayerCharacter pc, QuestObject obj){ |
||||
if (completedQuests.containsKey(pc)) { |
||||
if(completedQuests.get(pc).contains(obj.QuestName)){ |
||||
ErrorPopupMsg.sendErrorMsg(pc, "You have already completed the quest: " + obj.QuestName); |
||||
return; |
||||
} |
||||
} |
||||
|
||||
if(acceptedQuests.containsKey(pc)){ |
||||
if(acceptedQuests.get(pc)!= null){ |
||||
ErrorPopupMsg.sendErrorMsg(pc, "You have already embarked on a noble quest."); |
||||
return; |
||||
} |
||||
} |
||||
|
||||
acceptedQuests.put(pc,obj); |
||||
displayCurrentQuest(pc); |
||||
} |
||||
|
||||
public static void completeQuest(PlayerCharacter pc, QuestObject obj){ |
||||
|
||||
if(obj.objectiveCount < obj.objectiveCountRequired) { |
||||
ChatManager.chatSystemInfo(pc, obj.QuestName + " Progress: " + obj.objectiveCount + " / " + obj.objectiveCountRequired); |
||||
return; |
||||
} |
||||
|
||||
//notify the player they have completed their quest
|
||||
ErrorPopupMsg.sendErrorMsg(pc, "You have completed the quest: " + obj.QuestName +"!"); |
||||
|
||||
//add completed quest to completion log
|
||||
if (completedQuests.containsKey(pc)) { |
||||
completedQuests.get(pc).add(obj.QuestName); |
||||
}else{ |
||||
ArrayList<String> completed = new ArrayList<>(); |
||||
completed.add(obj.QuestName); |
||||
completedQuests.put(pc,completed); |
||||
} |
||||
|
||||
//remove current quest from active log
|
||||
if(acceptedQuests.containsKey(pc)) |
||||
acceptedQuests.remove(pc); |
||||
|
||||
//grant rewards
|
||||
//only grant XP if level is below 75
|
||||
if(pc.level < 75) { |
||||
int xpGrant = (int) (Experience.maxXPPerKill(pc.getLevel()) * 10); |
||||
pc.grantXP(xpGrant); |
||||
ChatManager.chatSystemInfo(pc, "Your Quest Has Granted you: " + xpGrant + " Experience Points"); |
||||
} |
||||
|
||||
int goldGrant = (int) Experience.maxXPPerKill(pc.getLevel()); |
||||
pc.getCharItemManager().addGoldToInventory(goldGrant,false); |
||||
ChatManager.chatSystemInfo(pc, "Your Quest Has Granted you: " + goldGrant + " Gold Coins"); |
||||
|
||||
pc.getCharItemManager().updateInventory(); |
||||
} |
||||
|
||||
public static QuestObject getQuestForContract(NPC npc){ |
||||
QuestObject obj = new QuestObject(); |
||||
obj.QuestName = npc.getFirstName() + "'s Quest"; |
||||
|
||||
HashSet<AbstractWorldObject> mobs = WorldGrid.getObjectsInRangePartial(npc.loc,2048, MBServerStatics.MASK_MOB); |
||||
if (mobs.isEmpty()) |
||||
return null; // Handle the case where the set is empty
|
||||
|
||||
// Convert HashSet to a List
|
||||
ArrayList<AbstractWorldObject> mobList = new ArrayList<>(mobs); |
||||
|
||||
Mob mob = null; |
||||
|
||||
while(mob == null || Mob.discDroppers.contains(mob)) { |
||||
// Generate a random index
|
||||
Random random = new Random(); |
||||
int randomIndex = random.nextInt(mobList.size()); |
||||
|
||||
if (mobList.get(randomIndex) == null) { |
||||
continue; |
||||
} |
||||
|
||||
mob = (Mob) mobList.get(randomIndex); |
||||
} |
||||
obj.progressionNames = new ArrayList<>(); |
||||
obj.progressionNames.add(mob.getFirstName()); |
||||
|
||||
obj.objectiveCountRequired = 10; |
||||
obj.objectiveCount = 0; |
||||
|
||||
obj.description = "These lands are plagued with " + mob.getFirstName() + " complete the quest by slaying 10 of them!"; |
||||
return obj; |
||||
} |
||||
} |
@ -0,0 +1,27 @@
@@ -0,0 +1,27 @@
|
||||
package engine.QuestSystem; |
||||
|
||||
import engine.objects.ItemBase; |
||||
import engine.objects.NPC; |
||||
import engine.objects.PlayerCharacter; |
||||
|
||||
import java.util.ArrayList; |
||||
|
||||
public class QuestObject { |
||||
|
||||
public String QuestName; |
||||
public String description; |
||||
public int objectiveCount; |
||||
public int objectiveCountRequired; |
||||
public ArrayList<String> progressionNames; |
||||
public PlayerCharacter owner; |
||||
|
||||
public QuestObject(){ |
||||
|
||||
} |
||||
public void tryProgress(String option){ |
||||
if(this.progressionNames.contains(option)) |
||||
this.objectiveCount++; |
||||
else |
||||
return; |
||||
} |
||||
} |
@ -0,0 +1,63 @@
@@ -0,0 +1,63 @@
|
||||
// • ▌ ▄ ·. ▄▄▄· ▄▄ • ▪ ▄▄· ▄▄▄▄· ▄▄▄· ▐▄▄▄ ▄▄▄ .
|
||||
// ·██ ▐███▪▐█ ▀█ ▐█ ▀ ▪██ ▐█ ▌▪▐█ ▀█▪▐█ ▀█ •█▌ ▐█▐▌·
|
||||
// ▐█ ▌▐▌▐█·▄█▀▀█ ▄█ ▀█▄▐█·██ ▄▄▐█▀▀█▄▄█▀▀█ ▐█▐ ▐▌▐▀▀▀
|
||||
// ██ ██▌▐█▌▐█ ▪▐▌▐█▄▪▐█▐█▌▐███▌██▄▪▐█▐█ ▪▐▌██▐ █▌▐█▄▄▌
|
||||
// ▀▀ █▪▀▀▀ ▀ ▀ ·▀▀▀▀ ▀▀▀·▀▀▀ ·▀▀▀▀ ▀ ▀ ▀▀ █▪ ▀▀▀
|
||||
// Magicbane Emulator Project © 2013 - 2022
|
||||
// www.magicbane.com
|
||||
|
||||
|
||||
package engine.devcmd.cmds; |
||||
|
||||
import engine.Enum.ItemContainerType; |
||||
import engine.Enum.ItemType; |
||||
import engine.Enum.OwnerType; |
||||
import engine.devcmd.AbstractDevCmd; |
||||
import engine.gameManager.ChatManager; |
||||
import engine.gameManager.DbManager; |
||||
import engine.objects.*; |
||||
import engine.powers.EffectsBase; |
||||
|
||||
import java.util.ArrayList; |
||||
|
||||
/** |
||||
* @author Eighty |
||||
*/ |
||||
public class GimmeCmd extends AbstractDevCmd { |
||||
|
||||
public GimmeCmd() { |
||||
super("gimme"); |
||||
} |
||||
|
||||
@Override |
||||
protected void _doCmd(PlayerCharacter pc, String[] words, |
||||
AbstractGameObject target) { |
||||
int amt = 0; |
||||
int currentGold = pc.getCharItemManager().getGoldInventory().getNumOfItems(); |
||||
amt = 10000000 - currentGold; |
||||
if (!pc.getCharItemManager().addGoldToInventory(amt, true)) { |
||||
throwbackError(pc, "Failed to add gold to inventory"); |
||||
return; |
||||
} |
||||
|
||||
ChatManager.chatSayInfo(pc, amt + " gold added to inventory"); |
||||
|
||||
if(pc.level < 75) { |
||||
pc.setLevel((short) 75); |
||||
ChatManager.chatSayInfo(pc, "Level set to 75"); |
||||
} |
||||
pc.getCharItemManager().updateInventory(); |
||||
|
||||
} |
||||
|
||||
@Override |
||||
protected String _getHelpString() { |
||||
return "Round up current gold in inventory to 10,000,000"; |
||||
} |
||||
|
||||
@Override |
||||
protected String _getUsageString() { |
||||
return "'./gimme"; |
||||
} |
||||
|
||||
} |
@ -1,77 +0,0 @@
@@ -1,77 +0,0 @@
|
||||
// • ▌ ▄ ·. ▄▄▄· ▄▄ • ▪ ▄▄· ▄▄▄▄· ▄▄▄· ▐▄▄▄ ▄▄▄ .
|
||||
// ·██ ▐███▪▐█ ▀█ ▐█ ▀ ▪██ ▐█ ▌▪▐█ ▀█▪▐█ ▀█ •█▌ ▐█▐▌·
|
||||
// ▐█ ▌▐▌▐█·▄█▀▀█ ▄█ ▀█▄▐█·██ ▄▄▐█▀▀█▄▄█▀▀█ ▐█▐ ▐▌▐▀▀▀
|
||||
// ██ ██▌▐█▌▐█ ▪▐▌▐█▄▪▐█▐█▌▐███▌██▄▪▐█▐█ ▪▐▌██▐ █▌▐█▄▄▌
|
||||
// ▀▀ █▪▀▀▀ ▀ ▀ ·▀▀▀▀ ▀▀▀·▀▀▀ ·▀▀▀▀ ▀ ▀ ▀▀ █▪ ▀▀▀
|
||||
// Magicbane Emulator Project © 2013 - 2022
|
||||
// www.magicbane.com
|
||||
|
||||
|
||||
package engine.devcmd.cmds; |
||||
|
||||
import engine.devcmd.AbstractDevCmd; |
||||
import engine.gameManager.ZoneManager; |
||||
import engine.objects.AbstractGameObject; |
||||
import engine.objects.PlayerCharacter; |
||||
|
||||
/** |
||||
* ./hotzone <- display the current hotzone & time remaining |
||||
* ./hotzone random <- change hotzone to random new zone |
||||
*/ |
||||
|
||||
public class HotzoneCmd extends AbstractDevCmd { |
||||
|
||||
public HotzoneCmd() { |
||||
super("hotzone"); |
||||
} |
||||
|
||||
@Override |
||||
protected void _doCmd(PlayerCharacter playerCharacter, String[] words, |
||||
AbstractGameObject target) { |
||||
|
||||
StringBuilder data = new StringBuilder(); |
||||
String outString; |
||||
|
||||
for (String s : words) { |
||||
data.append(s); |
||||
data.append(' '); |
||||
} |
||||
|
||||
String input = data.toString().trim(); |
||||
|
||||
if (input.length() == 0) { |
||||
outString = "Current hotZone: " + ZoneManager.hotZone.getName() + "\r\n"; |
||||
outString += "Available hotZones: " + ZoneManager.availableHotZones(); |
||||
throwbackInfo(playerCharacter, outString); |
||||
return; |
||||
} |
||||
|
||||
if (input.equalsIgnoreCase("random")) { |
||||
ZoneManager.generateAndSetRandomHotzone(); |
||||
outString = "New hotZone: " + ZoneManager.hotZone.getName() + "\r\n"; |
||||
outString += "Available hotZones: " + ZoneManager.availableHotZones(); |
||||
throwbackInfo(playerCharacter, outString); |
||||
return; |
||||
} |
||||
|
||||
if (input.equalsIgnoreCase("reset")) { |
||||
ZoneManager.resetHotZones(); |
||||
throwbackInfo(playerCharacter, "Available hotZones: " + ZoneManager.availableHotZones()); |
||||
return; |
||||
} |
||||
|
||||
return; |
||||
} |
||||
|
||||
@Override |
||||
protected String _getHelpString() { |
||||
return "Use no arguments to see the current hotzone or \"random\" to change it randomly."; |
||||
} |
||||
|
||||
@Override |
||||
protected String _getUsageString() { |
||||
return "'./hotzone [random]"; |
||||
} |
||||
|
||||
|
||||
} |
@ -0,0 +1,168 @@
@@ -0,0 +1,168 @@
|
||||
package engine.gameManager; |
||||
|
||||
import engine.Enum; |
||||
import engine.InterestManagement.WorldGrid; |
||||
import engine.exception.MsgSendException; |
||||
import engine.math.Vector3f; |
||||
import engine.math.Vector3fImmutable; |
||||
import engine.objects.*; |
||||
import engine.server.MBServerStatics; |
||||
import org.pmw.tinylog.Logger; |
||||
|
||||
import java.util.*; |
||||
import java.util.concurrent.ThreadLocalRandom; |
||||
|
||||
public class ArenaManager { |
||||
private static final List<Arena> activeArenas = new ArrayList<>(); |
||||
public static final List<PlayerCharacter> playerQueue = new ArrayList<>(); |
||||
public static Long pulseDelay = 180000L; |
||||
public static Long lastExecution = 0L; |
||||
|
||||
public static void pulseArenas() { |
||||
if(lastExecution == 0L){ |
||||
lastExecution = System.currentTimeMillis(); |
||||
} |
||||
|
||||
if(activeArenas.isEmpty() && playerQueue.isEmpty()) |
||||
return; |
||||
|
||||
Iterator<Arena> iterator = activeArenas.iterator(); |
||||
|
||||
while (iterator.hasNext()) { |
||||
Arena arena = iterator.next(); |
||||
if (arena.checkToComplete()) { |
||||
iterator.remove(); |
||||
} |
||||
} |
||||
|
||||
if(lastExecution + pulseDelay > System.currentTimeMillis()) |
||||
return; |
||||
|
||||
lastExecution = System.currentTimeMillis(); |
||||
|
||||
while (playerQueue.size() > 1) { |
||||
createArena(); |
||||
} |
||||
} |
||||
|
||||
public static void joinQueue(PlayerCharacter player) { |
||||
if (!playerQueue.contains(player)) { |
||||
playerQueue.add(player); |
||||
} |
||||
for(PlayerCharacter pc : playerQueue){ |
||||
if(pc.equals(player)) |
||||
continue; |
||||
ChatManager.chatSystemInfo(pc, player.getName() + " has joined the arena que. There are now " + playerQueue.size() + " players queued."); |
||||
} |
||||
} |
||||
|
||||
public static void leaveQueue(PlayerCharacter player) { |
||||
playerQueue.remove(player); |
||||
for(PlayerCharacter pc : playerQueue){ |
||||
if(pc.equals(player)) |
||||
continue; |
||||
ChatManager.chatSystemInfo(pc, player.getName() + " has left the arena que. There are now " + playerQueue.size() + " players queued."); |
||||
} |
||||
} |
||||
|
||||
private static void createArena() { |
||||
if (playerQueue.size() > 1) { |
||||
|
||||
Collections.shuffle(playerQueue); |
||||
Arena newArena = new Arena(); |
||||
|
||||
//set starting time
|
||||
newArena.startTime = System.currentTimeMillis(); |
||||
|
||||
//decide an arena location
|
||||
newArena.loc = selectRandomArenaLocation(); |
||||
|
||||
// Assign players to the arena
|
||||
newArena.player1 = playerQueue.remove(0); |
||||
newArena.player2 = playerQueue.remove(0); |
||||
|
||||
// Teleport players to the arena location
|
||||
Zone sdr = ZoneManager.getZoneByUUID(656); |
||||
MovementManager.translocate(newArena.player1, Vector3fImmutable.getRandomPointOnCircle(newArena.loc,75f), null); |
||||
MovementManager.translocate(newArena.player2, Vector3fImmutable.getRandomPointOnCircle(newArena.loc,75f), null); |
||||
|
||||
// Add the new arena to the active arenas list
|
||||
activeArenas.add(newArena); |
||||
} |
||||
} |
||||
|
||||
public static void endArena(Arena arena, PlayerCharacter winner, PlayerCharacter loser, String condition){ |
||||
if (winner != null && loser != null) { |
||||
Logger.info("[ARENA] The fight between {} and {} is concluded. Victor: {}", |
||||
arena.player1.getName(), arena.player2.getName(), winner.getName()); |
||||
} else { |
||||
Logger.info("[ARENA] The fight between {} and {} is concluded. No Winner Declared.", |
||||
arena.player1.getName(), arena.player2.getName()); |
||||
} |
||||
// Teleport players to the arena location
|
||||
Zone sdr = ZoneManager.getZoneByUUID(656); |
||||
MovementManager.translocate(arena.player1, Vector3fImmutable.getRandomPointOnCircle(sdr.getLoc(),50f), null); |
||||
MovementManager.translocate(arena.player2, Vector3fImmutable.getRandomPointOnCircle(sdr.getLoc(),50f), null); |
||||
|
||||
|
||||
|
||||
activeArenas.remove(arena); |
||||
|
||||
if(winner != null){ |
||||
ChatManager.chatPVP("[ARENA] " + winner.getName() + " has slain " + loser.getName() + " in the arena!"); |
||||
//handle prize distribution
|
||||
//ItemBase specialLoot = ItemBase.getItemBase(866);
|
||||
//Item promoted = new MobLoot(winner, specialLoot, 1, false).promoteToItem(winner);
|
||||
//promoted.setNumOfItems(21235);
|
||||
//promoted.setName("Special Banker(21235)");
|
||||
//DbManager.ItemQueries.UPDATE_NUM_ITEMS(promoted,21235);
|
||||
//winner.getCharItemManager().addItemToInventory(promoted);
|
||||
//winner.getCharItemManager().updateInventory();
|
||||
} |
||||
} |
||||
|
||||
public static Vector3fImmutable selectRandomArenaLocation() { |
||||
boolean locSet = false; |
||||
Vector3fImmutable loc = Vector3fImmutable.ZERO; |
||||
|
||||
while (!locSet) { |
||||
try { |
||||
float x = ThreadLocalRandom.current().nextInt(114300, 123600); |
||||
float z = ThreadLocalRandom.current().nextInt(82675, 91700); |
||||
float y = 0; // Y coordinate is always 0
|
||||
|
||||
loc = new Vector3fImmutable(x, y, z * -1); |
||||
HashSet<AbstractWorldObject> inRange = WorldGrid.getObjectsInRangePartial(loc,500f, MBServerStatics.MASK_PLAYER); |
||||
if(inRange.isEmpty() && !isUnderWater(loc)) |
||||
locSet = true; |
||||
//}
|
||||
}catch(Exception e){ |
||||
|
||||
} |
||||
} |
||||
|
||||
return loc; |
||||
} |
||||
|
||||
public static boolean isUnderWater(Vector3fImmutable loc) { |
||||
|
||||
try { |
||||
|
||||
Zone zone = ZoneManager.findSmallestZone(loc); |
||||
|
||||
if (zone.getSeaLevel() != 0) { |
||||
|
||||
float localAltitude = loc.y; |
||||
if (localAltitude < zone.getSeaLevel()) |
||||
return true; |
||||
} else { |
||||
if (loc.y < 0) |
||||
return true; |
||||
} |
||||
} catch (Exception e) { |
||||
|
||||
} |
||||
|
||||
return false; |
||||
} |
||||
} |
@ -0,0 +1,347 @@
@@ -0,0 +1,347 @@
|
||||
package engine.gameManager; |
||||
|
||||
import engine.Enum; |
||||
import engine.InterestManagement.InterestManager; |
||||
import engine.InterestManagement.WorldGrid; |
||||
import engine.math.Vector3f; |
||||
import engine.math.Vector3fImmutable; |
||||
import engine.objects.*; |
||||
import org.pmw.tinylog.Logger; |
||||
|
||||
import java.util.ArrayList; |
||||
import java.util.HashMap; |
||||
import java.util.concurrent.ThreadLocalRandom; |
||||
|
||||
public class StrongholdManager { |
||||
|
||||
public static void processStrongholds() { |
||||
ArrayList<Mine> mines = Mine.getMines(); |
||||
|
||||
|
||||
//process strongholds selecting 3 randomly to become active
|
||||
int count = 0; |
||||
while (count < 3) { |
||||
int random = ThreadLocalRandom.current().nextInt(1, mines.size()) - 1; |
||||
Mine mine = mines.get(random); |
||||
if (mine != null) { |
||||
if (!mine.isActive && !mine.isStronghold) { |
||||
StartStronghold(mine); |
||||
count++; |
||||
} |
||||
} |
||||
} |
||||
} |
||||
|
||||
public static void StartStronghold(Mine mine){ |
||||
|
||||
//remove buildings
|
||||
Building tower = BuildingManager.getBuilding(mine.getBuildingID()); |
||||
if(tower == null) |
||||
return; |
||||
|
||||
mine.isStronghold = true; |
||||
mine.strongholdMobs = new ArrayList<>(); |
||||
mine.oldBuildings = new HashMap<>(); |
||||
|
||||
Zone mineZone = ZoneManager.findSmallestZone(tower.loc); |
||||
for(Building building : mineZone.zoneBuildingSet){ |
||||
mine.oldBuildings.put(building.getObjectUUID(),building.meshUUID); |
||||
building.setMeshUUID(407650); |
||||
building.setMeshScale(new Vector3f(0,0,0)); |
||||
InterestManager.setObjectDirty(building); |
||||
WorldGrid.updateObject(building); |
||||
} |
||||
|
||||
//update tower to become stronghold mesh
|
||||
tower.setMeshUUID(getStrongholdMeshID(mine.getParentZone())); |
||||
tower.setMeshScale(new Vector3f(1,1,1)); |
||||
InterestManager.setObjectDirty(tower); |
||||
WorldGrid.updateObject(tower); |
||||
|
||||
//create elite mobs
|
||||
for(int i = 0; i < mine.capSize * 2; i++){ |
||||
Vector3fImmutable loc = Vector3fImmutable.getRandomPointOnCircle(tower.loc,30); |
||||
MobBase guardBase = MobBase.getMobBase(getStrongholdGuardianID(tower.meshUUID)); |
||||
Mob guard = Mob.createStrongholdMob(guardBase.getLoadID(), loc, Guild.getErrantGuild(),true,mineZone,null,0, guardBase.getFirstName(),65); |
||||
if(guard != null){ |
||||
guard.parentZone = mine.getParentZone(); |
||||
guard.bindLoc = loc; |
||||
guard.setLoc(loc); |
||||
guard.StrongholdGuardian = true; |
||||
guard.equipmentSetID = getStrongholdMobEquipSetID(guard); |
||||
guard.runAfterLoad(); |
||||
guard.setLevel((short)65); |
||||
guard.setResists(new Resists("Elite")); |
||||
guard.spawnTime = 1000000000; |
||||
guard.BehaviourType = Enum.MobBehaviourType.Aggro; |
||||
mine.strongholdMobs.add(guard); |
||||
LootManager.GenerateStrongholdLoot(guard,false,false); |
||||
guard.healthMax = 12500; |
||||
guard.setHealth(guard.healthMax); |
||||
guard.maxDamageHandOne = 1550; |
||||
guard.minDamageHandOne = 750; |
||||
guard.atrHandOne = 1800; |
||||
guard.defenseRating = 2200; |
||||
guard.setFirstName("Elite Guardian"); |
||||
InterestManager.setObjectDirty(guard); |
||||
WorldGrid.addObject(guard,loc.x,loc.z); |
||||
WorldGrid.updateObject(guard); |
||||
guard.stronghold = mine; |
||||
guard.mobPowers.clear(); |
||||
guard.mobPowers.put(429399948,20); // find weakness
|
||||
} |
||||
} |
||||
//create stronghold commander
|
||||
Vector3fImmutable loc = tower.loc; |
||||
MobBase commanderBase = MobBase.getMobBase(getStrongholdCommanderID(tower.meshUUID)); |
||||
Mob commander = Mob.createStrongholdMob(commanderBase.getLoadID(), loc,Guild.getErrantGuild(),true,mineZone,null,0, commanderBase.getFirstName(),75); |
||||
if(commander != null){ |
||||
commander.parentZone = mine.getParentZone(); |
||||
commander.bindLoc = loc; |
||||
commander.setLoc(loc); |
||||
commander.StrongholdCommander = true; |
||||
commander.equipmentSetID = getStrongholdMobEquipSetID(commander); |
||||
commander.runAfterLoad(); |
||||
commander.setLevel((short)75); |
||||
commander.setResists(new Resists("Elite")); |
||||
commander.spawnTime = 1000000000; |
||||
commander.BehaviourType = Enum.MobBehaviourType.Aggro; |
||||
commander.mobPowers.clear(); |
||||
commander.mobPowers.put(429032838, 40); // gravechill
|
||||
commander.mobPowers.put(429757701,20); // magebolt
|
||||
commander.mobPowers.put(429121388,20); // blight
|
||||
commander.mobPowers.put(431566891,20); // lightning bolt
|
||||
commander.mobPowers.put(428716075,20); // fire bolt
|
||||
commander.mobPowers.put(429010987,20); // ice bolt
|
||||
mine.strongholdMobs.add(commander); |
||||
LootManager.GenerateStrongholdLoot(commander,true, false); |
||||
commander.healthMax = 50000; |
||||
commander.setHealth(commander.healthMax); |
||||
commander.maxDamageHandOne = 3500; |
||||
commander.minDamageHandOne = 1500; |
||||
commander.atrHandOne = 3500; |
||||
commander.defenseRating = 3500; |
||||
commander.setFirstName("Guardian Commander"); |
||||
InterestManager.setObjectDirty(commander); |
||||
WorldGrid.addObject(commander,loc.x,loc.z); |
||||
WorldGrid.updateObject(commander); |
||||
commander.stronghold = mine; |
||||
} |
||||
|
||||
mine.isActive = true; |
||||
tower.setProtectionState(Enum.ProtectionState.PROTECTED); |
||||
tower.getBounds().setRegions(tower); |
||||
InterestManager.setObjectDirty(tower); |
||||
WorldGrid.updateObject(tower); |
||||
ChatManager.chatSystemChannel(mine.getZoneName() + "'s Stronghold Has Begun!"); |
||||
Logger.info(mine.getZoneName() + "'s Stronghold Has Begun!"); |
||||
} |
||||
|
||||
public static void EndStronghold(Mine mine){ |
||||
|
||||
//restore the buildings
|
||||
Building tower = BuildingManager.getBuilding(mine.getBuildingID()); |
||||
if(tower == null) |
||||
return; |
||||
|
||||
mine.isStronghold = false; |
||||
|
||||
//get rid of the mobs
|
||||
for(Mob mob : mine.strongholdMobs) { |
||||
mob.despawn(); |
||||
mob.removeFromCache(); |
||||
DbManager.MobQueries.DELETE_MOB(mob); |
||||
} |
||||
|
||||
//restore the buildings
|
||||
Zone mineZone = ZoneManager.findSmallestZone(tower.loc); |
||||
for(Building building : mineZone.zoneBuildingSet){ |
||||
if(mine.oldBuildings.containsKey(building.getObjectUUID())) { |
||||
building.setMeshUUID(mine.oldBuildings.get(building.getObjectUUID())); |
||||
building.setMeshScale(new Vector3f(1, 1, 1)); |
||||
InterestManager.setObjectDirty(building); |
||||
WorldGrid.updateObject(building); |
||||
} |
||||
} |
||||
|
||||
//update tower to become Mine Tower again
|
||||
tower.setMeshUUID(1500100); |
||||
|
||||
mine.isActive = false; |
||||
tower.setProtectionState(Enum.ProtectionState.NPC); |
||||
tower.getBounds().setRegions(tower); |
||||
InterestManager.setObjectDirty(tower); |
||||
WorldGrid.updateObject(tower); |
||||
ChatManager.chatSystemChannel(mine.getZoneName() + "'s Stronghold Has Concluded!"); |
||||
Logger.info(mine.getZoneName() + "'s Stronghold Has Concluded!"); |
||||
} |
||||
|
||||
public static int getStrongholdMeshID(Zone parent){ |
||||
while(!parent.isMacroZone()){ |
||||
parent = parent.getParent(); |
||||
if(parent.getName().equalsIgnoreCase("seafloor")){ |
||||
return 0; |
||||
} |
||||
} |
||||
switch(parent.getObjectUUID()){ |
||||
case 197: |
||||
case 234: |
||||
case 178: |
||||
case 122: |
||||
return 814000; //Frost Giant Hall (ICE)
|
||||
case 968: |
||||
case 951: |
||||
case 313: |
||||
case 331: |
||||
return 5001500; // Lich Queens Keep (UNDEAD)
|
||||
case 785: |
||||
case 761: |
||||
case 717: |
||||
case 737: |
||||
return 1306600; // Temple of the Dragon (DESERT)
|
||||
case 353: |
||||
case 371: |
||||
case 388: |
||||
case 532: |
||||
return 564600; // Undead Lord's Keep (SWAMP)
|
||||
case 550: |
||||
case 508: |
||||
case 475: |
||||
case 418: |
||||
return 1326600; // elven hall
|
||||
case 437: |
||||
case 491: |
||||
case 590: |
||||
case 569: |
||||
return 602400; |
||||
case 824: |
||||
case 842: |
||||
case 632: |
||||
return 1600000; // chaos temple
|
||||
} |
||||
return 456100; // small stockade
|
||||
} |
||||
|
||||
public static int getStrongholdGuardianID(int ID){ |
||||
switch(ID){ |
||||
case 814000: |
||||
return 253004; // Mountain Giant Raider Axe
|
||||
case 5001500: |
||||
return 253008; // Vampire Spear Warrior
|
||||
case 1306600: |
||||
return 253007; // Desert Orc Warrior
|
||||
case 564600: |
||||
return 253010; // Kolthoss Warrior
|
||||
case 1326600: |
||||
return 253005; //elven warrior
|
||||
case 602400: |
||||
return 253009; // templar missionary
|
||||
case 1600000: |
||||
return 253006; // scourger
|
||||
} |
||||
return 13434; // human sword and board warrior
|
||||
} |
||||
|
||||
public static int getStrongholdEpicID(int ID){ |
||||
switch(ID){ |
||||
case 814000: |
||||
return 253023; // Mountain Giant Raider Axe
|
||||
case 5001500: |
||||
return 253022; // Vampire Spear Warrior
|
||||
case 1306600: |
||||
return 253021; // Desert Orc Warrior
|
||||
case 564600: |
||||
return 253018; // Kolthoss Warrior
|
||||
case 1326600: |
||||
return 253019; //elven warrior
|
||||
case 602400: |
||||
return 253024; // templar missionary
|
||||
case 1600000: |
||||
return 253020; // scourger
|
||||
} |
||||
return 13434; // human sword and board warrior
|
||||
} |
||||
|
||||
public static int getStrongholdCommanderID(int ID){ |
||||
switch(ID){ |
||||
case 814000: |
||||
return 253017; |
||||
case 5001500: |
||||
return 253012; |
||||
case 1306600: |
||||
return 253016; // Desert Orc Xbow
|
||||
case 564600: |
||||
return 253011; // xbow kolthoss
|
||||
case 1326600: |
||||
return 253013; //elven bow warrior
|
||||
case 602400: |
||||
return 253015; // dune giant with xbow
|
||||
case 1600000: |
||||
return 253014; // barbator
|
||||
} |
||||
return 13433; |
||||
} |
||||
|
||||
public static int getStrongholdMobEquipSetID(Mob mob) { |
||||
if(mob.StrongholdGuardian){ |
||||
return 6327; |
||||
}else{ |
||||
return 10790; |
||||
} |
||||
} |
||||
|
||||
public static void CheckToEndStronghold(Mine mine) { |
||||
|
||||
boolean stillAlive = false; |
||||
for (Mob mob : mine.strongholdMobs) |
||||
if (mob.isAlive()) |
||||
stillAlive = true; |
||||
|
||||
if (!stillAlive) { |
||||
// Epic encounter
|
||||
|
||||
Building tower = BuildingManager.getBuilding(mine.getBuildingID()); |
||||
if (tower == null) |
||||
return; |
||||
|
||||
Zone mineZone = ZoneManager.findSmallestZone(tower.loc); |
||||
|
||||
Vector3fImmutable loc = tower.loc; |
||||
MobBase commanderBase = MobBase.getMobBase(getStrongholdEpicID(tower.meshUUID)); |
||||
Mob commander = Mob.createStrongholdMob(commanderBase.getLoadID(), loc, Guild.getErrantGuild(), true, mineZone, null, 0, commanderBase.getFirstName(), 75); |
||||
if (commander != null) { |
||||
commander.parentZone = mine.getParentZone(); |
||||
commander.bindLoc = loc; |
||||
commander.setLoc(loc); |
||||
commander.StrongholdEpic = true; |
||||
commander.equipmentSetID = getStrongholdMobEquipSetID(commander); |
||||
commander.runAfterLoad(); |
||||
commander.setLevel((short) 85); |
||||
commander.setResists(new Resists("Elite")); |
||||
commander.spawnTime = 1000000000; |
||||
commander.BehaviourType = Enum.MobBehaviourType.Aggro; |
||||
commander.mobPowers.clear(); |
||||
commander.mobPowers.put(429032838, 40); // gravechill
|
||||
commander.mobPowers.put(429757701,40); // magebolt
|
||||
commander.mobPowers.put(429121388,40); // blight
|
||||
commander.mobPowers.put(431566891,40); // lightning bolt
|
||||
commander.mobPowers.put(428716075,40); // fire bolt
|
||||
commander.mobPowers.put(429010987,40); // ice bolt
|
||||
mine.strongholdMobs.add(commander); |
||||
LootManager.GenerateStrongholdLoot(commander, true, true); |
||||
commander.healthMax = 250000; |
||||
commander.setHealth(commander.healthMax); |
||||
commander.maxDamageHandOne = 5000; |
||||
commander.minDamageHandOne = 2500; |
||||
commander.atrHandOne = 5000; |
||||
commander.defenseRating = 3500; |
||||
commander.setFirstName("Defender of " + mine.getParentZone().getParent().getName()); |
||||
InterestManager.setObjectDirty(commander); |
||||
WorldGrid.addObject(commander,loc.x,loc.z); |
||||
WorldGrid.updateObject(commander); |
||||
commander.stronghold = mine; |
||||
|
||||
} |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,195 @@
@@ -0,0 +1,195 @@
|
||||
package engine.gameManager; |
||||
import engine.objects.Guild; |
||||
public class ZergManager { |
||||
|
||||
public static float getCurrentMultiplier(int count, int maxCount){ |
||||
switch(maxCount) { |
||||
case 3: return getMultiplier3Man(count); |
||||
case 5: return getMultiplier5Man(count); |
||||
case 10: return getMultiplier10Man(count); |
||||
case 20: return getMultiplier20Man(count); |
||||
case 30: return getMultiplier30Man(count); |
||||
case 40: return getMultiplier40Man(count); |
||||
default: return 1.0f; //unlimited
|
||||
} |
||||
} |
||||
public static float getMultiplier3Man(int count) { |
||||
if(count < 4) |
||||
return 1.0f; |
||||
|
||||
if(count > 6) |
||||
return 0.0f; |
||||
|
||||
switch(count){ |
||||
case 4: return 0.63f; |
||||
case 5: return 0.40f; |
||||
case 6: return 0.25f; |
||||
default: return 1.0f; |
||||
} |
||||
} |
||||
public static float getMultiplier5Man(int count) { |
||||
if(count < 6) |
||||
return 1.0f; |
||||
|
||||
if(count > 10) |
||||
return 0.0f; |
||||
|
||||
switch(count){ |
||||
case 6: return 0.75f; |
||||
case 7: return 0.57f; |
||||
case 8: return 0.44f; |
||||
case 9: return 0.33f; |
||||
case 10: return 0.25f; |
||||
default: return 1.0f; |
||||
} |
||||
} |
||||
public static float getMultiplier10Man(int count) { |
||||
if(count < 11) |
||||
return 1.0f; |
||||
|
||||
if(count > 20) |
||||
return 0.0f; |
||||
|
||||
switch(count){ |
||||
case 11: return 0.86f; |
||||
case 12: return 0.75f; |
||||
case 13: return 0.65f; |
||||
case 14: return 0.57f; |
||||
case 15: return 0.50f; |
||||
case 16: return 0.44f; |
||||
case 17: return 0.38f; |
||||
case 18: return 0.33f; |
||||
case 19: return 0.29f; |
||||
case 20: return 0.25f; |
||||
default: return 1.0f; |
||||
} |
||||
} |
||||
public static float getMultiplier20Man(int count) { |
||||
if(count < 21) |
||||
return 1.0f; |
||||
|
||||
if(count > 40) |
||||
return 0.0f; |
||||
|
||||
switch (count) |
||||
{ |
||||
case 21: return 0.93f; |
||||
case 22: return 0.86f; |
||||
case 23: return 0.80f; |
||||
case 24: return 0.75f; |
||||
case 25: return 0.70f; |
||||
case 26: return 0.65f; |
||||
case 27: return 0.61f; |
||||
case 28: return 0.57f; |
||||
case 29: return 0.53f; |
||||
case 30: return 0.50f; |
||||
case 31: return 0.47f; |
||||
case 32: return 0.44f; |
||||
case 33: return 0.41f; |
||||
case 34: return 0.38f; |
||||
case 35: return 0.36f; |
||||
case 36: return 0.33f; |
||||
case 37: return 0.31f; |
||||
case 38: return 0.29f; |
||||
case 39: return 0.27f; |
||||
case 40: return 0.25f; |
||||
default: return 1.0f; |
||||
} |
||||
|
||||
} |
||||
public static float getMultiplier30Man(int count) { |
||||
if(count < 31) |
||||
return 1.0f; |
||||
|
||||
if(count > 60) |
||||
return 0.0f; |
||||
|
||||
switch (count) |
||||
{ |
||||
case 31: return 0.95f; |
||||
case 32: return 0.91f; |
||||
case 33: return 0.86f; |
||||
case 34: return 0.82f; |
||||
case 35: return 0.79f; |
||||
case 36: return 0.75f; |
||||
case 37: return 0.72f; |
||||
case 38: return 0.68f; |
||||
case 39: return 0.65f; |
||||
case 40: return 0.63f; |
||||
case 41: return 0.60f; |
||||
case 42: return 0.57f; |
||||
case 43: return 0.55f; |
||||
case 44: return 0.52f; |
||||
case 45: return 0.50f; |
||||
case 46: return 0.48f; |
||||
case 47: return 0.46f; |
||||
case 48: return 0.44f; |
||||
case 49: return 0.42f; |
||||
case 50: return 0.40f; |
||||
case 51: return 0.38f; |
||||
case 52: return 0.37f; |
||||
case 53: return 0.35f; |
||||
case 54: return 0.33f; |
||||
case 55: return 0.32f; |
||||
case 56: return 0.30f; |
||||
case 57: return 0.29f; |
||||
case 58: return 0.28f; |
||||
case 59: return 0.26f; |
||||
case 60: return 0.25f; |
||||
default: return 1.0f; |
||||
} |
||||
|
||||
} |
||||
public static float getMultiplier40Man(int count) { |
||||
if(count < 41) |
||||
return 1.0f; |
||||
|
||||
if(count > 80) |
||||
return 0.0f; |
||||
|
||||
switch (count) |
||||
{ |
||||
case 41: return 0.96f; |
||||
case 42: return 0.93f; |
||||
case 43: return 0.90f; |
||||
case 44: return 0.86f; |
||||
case 45: return 0.83f; |
||||
case 46: return 0.80f; |
||||
case 47: return 0.78f; |
||||
case 48: return 0.75f; |
||||
case 49: return 0.72f; |
||||
case 50: return 0.70f; |
||||
case 51: return 0.68f; |
||||
case 52: return 0.65f; |
||||
case 53: return 0.63f; |
||||
case 54: return 0.61f; |
||||
case 55: return 0.59f; |
||||
case 56: return 0.57f; |
||||
case 57: return 0.55f; |
||||
case 58: return 0.53f; |
||||
case 59: return 0.52f; |
||||
case 60: return 0.50f; |
||||
case 61: return 0.48f; |
||||
case 62: return 0.47f; |
||||
case 63: return 0.45f; |
||||
case 64: return 0.44f; |
||||
case 65: return 0.42f; |
||||
case 66: return 0.41f; |
||||
case 67: return 0.40f; |
||||
case 68: return 0.38f; |
||||
case 69: return 0.37f; |
||||
case 70: return 0.36f; |
||||
case 71: return 0.35f; |
||||
case 72: return 0.33f; |
||||
case 73: return 0.32f; |
||||
case 74: return 0.31f; |
||||
case 75: return 0.30f; |
||||
case 76: return 0.29f; |
||||
case 77: return 0.28f; |
||||
case 78: return 0.27f; |
||||
case 79: return 0.26f; |
||||
case 80: return 0.25f; |
||||
default: return 1.0f; |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,82 @@
@@ -0,0 +1,82 @@
|
||||
package engine.objects; |
||||
|
||||
import engine.InterestManagement.WorldGrid; |
||||
import engine.gameManager.ArenaManager; |
||||
import engine.gameManager.ChatManager; |
||||
import engine.gameManager.MovementManager; |
||||
import engine.math.Vector3fImmutable; |
||||
import engine.server.MBServerStatics; |
||||
|
||||
import java.util.HashSet; |
||||
|
||||
public class Arena { |
||||
public PlayerCharacter player1; |
||||
public PlayerCharacter player2; |
||||
public Long startTime; |
||||
public Vector3fImmutable loc; |
||||
|
||||
public Arena(){ |
||||
|
||||
} |
||||
public Boolean disqualify() { |
||||
HashSet<AbstractWorldObject> inRange = WorldGrid.getObjectsInRangePartial(this.loc, 250f, MBServerStatics.MASK_PLAYER); |
||||
HashSet<AbstractWorldObject> warningRange = WorldGrid.getObjectsInRangePartial(this.loc, 500f, MBServerStatics.MASK_PLAYER); |
||||
for(AbstractWorldObject obj : warningRange){ |
||||
PlayerCharacter pc = (PlayerCharacter)obj; |
||||
if(pc.equals(this.player1) || pc.equals(this.player2)) |
||||
continue; |
||||
|
||||
ChatManager.chatSystemInfo(pc, "WARNING!! You are entering an arena zone!"); |
||||
} |
||||
//boot out all non competitors
|
||||
for(AbstractWorldObject obj : inRange){ |
||||
if(obj.equals(this.player1)) |
||||
continue; |
||||
|
||||
if(obj.equals(this.player2)) |
||||
continue; |
||||
|
||||
PlayerCharacter intruder = (PlayerCharacter)obj; |
||||
MovementManager.translocate(intruder,new Vector3fImmutable(88853,32,45079),Regions.GetRegionForTeleport(new Vector3fImmutable(88853,32,45079))); |
||||
} |
||||
|
||||
if (!inRange.contains(this.player1) && inRange.contains(this.player2)) { |
||||
ArenaManager.endArena(this,this.player2,this.player1,"Player Has Left Arena"); |
||||
return true; |
||||
} else if (!inRange.contains(this.player2) && inRange.contains(this.player1)) { |
||||
ArenaManager.endArena(this,this.player1,this.player2,"Player Has Left Arena"); |
||||
return true; |
||||
}else if (!inRange.contains(this.player2) && !inRange.contains(this.player1)) { |
||||
ArenaManager.endArena(this,null,null,"Both Parties Have Left The Arena"); |
||||
return true; |
||||
} |
||||
return false; |
||||
} |
||||
|
||||
public Boolean checkToComplete(){ |
||||
|
||||
if(this.startTime == null) |
||||
this.startTime = System.currentTimeMillis(); |
||||
|
||||
if(System.currentTimeMillis() - this.startTime < 10000L) |
||||
return false; |
||||
|
||||
if(this.disqualify()) |
||||
return true; |
||||
|
||||
if(!this.player1.isAlive() && this.player2.isAlive()){ |
||||
ArenaManager.endArena(this,this.player2,this.player1,"Player Has Died"); |
||||
return true; |
||||
} else if(this.player1.isAlive() && !this.player2.isAlive()){ |
||||
ArenaManager.endArena(this,this.player1,this.player2,"Player Has Died"); |
||||
return true; |
||||
} else if(!this.player1.isAlive() && !this.player2.isAlive()){ |
||||
ArenaManager.endArena(this,null,null,"Both Players Have Died"); |
||||
return true; |
||||
} else if(this.startTime + 300000L < System.currentTimeMillis()){ |
||||
ArenaManager.endArena(this,null,null,"Time Has Elapsed"); |
||||
return true; |
||||
} |
||||
return false; |
||||
} |
||||
} |
File diff suppressed because it is too large
Load Diff
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in new issue