Compare commits

...

17 Commits

Author SHA1 Message Date
FatBoy 76284cf3c9 player update optimized 2025-02-17 16:36:12 -06:00
FatBoy 9d79afa395 player update optimized 2025-02-16 18:07:56 -06:00
FatBoy 944290f958 audit chat messages for target ID 2025-02-16 18:03:15 -06:00
FatBoy e6eb753666 audit chat messages for target ID 2025-02-16 18:03:13 -06:00
FatBoy 4ad7e0f021 fix track power range 2025-02-16 18:03:07 -06:00
FatBoy 8d587538e0 uptime to show boxed and active players 2025-02-16 18:03:04 -06:00
FatBoy 4ae64ab94c pet aggro fix 2025-02-16 18:03:02 -06:00
FatBoy c5e6205801 invis mob solution 2025-02-16 18:02:58 -06:00
FatBoy 5a3f4e690f mobs will attack player pets 2025-02-16 18:02:54 -06:00
FatBoy 048474b014 must be in safezone to switch boxes 2025-02-16 18:02:50 -06:00
FatBoy 24e01acff4 pet assistance 2025-02-16 18:02:04 -06:00
FatBoy a75670bf0e retaliate handled properly 2025-02-16 18:02:02 -06:00
FatBoy d56d58492a huntress pets properly granted modifiers 2025-02-16 18:01:59 -06:00
FatBoy 7b33c1392a set mob level earlier in routine 2025-02-16 18:01:54 -06:00
FatBoy 86c95f0eb5 disable gimme command 2025-02-16 18:01:47 -06:00
FatBoy 6ed648d6d4 catch weird city null error 2025-02-16 18:01:45 -06:00
FatBoy c722450f65 proper XP group scaling 2025-02-16 18:01:38 -06:00
15 changed files with 124 additions and 42 deletions
+5
View File
@@ -27,6 +27,7 @@ import engine.objects.*;
import engine.server.MBServerStatics; import engine.server.MBServerStatics;
import engine.server.world.WorldServer; import engine.server.world.WorldServer;
import engine.session.Session; import engine.session.Session;
import engine.util.KeyCloneAudit;
import org.pmw.tinylog.Logger; import org.pmw.tinylog.Logger;
import java.util.ArrayList; import java.util.ArrayList;
@@ -84,6 +85,10 @@ public enum ChatManager {
if ((checkTime > 0L) && (curMsgTime - checkTime < FLOOD_TIME_THRESHOLD)) if ((checkTime > 0L) && (curMsgTime - checkTime < FLOOD_TIME_THRESHOLD))
isFlood = true; isFlood = true;
if(KeyCloneAudit.auditChatMsg(pc,msg.getMessage())){
return;
}
switch (protocolMsg) { switch (protocolMsg) {
case CHATSAY: case CHATSAY:
ChatManager.chatSay(pc, msg.getMessage(), isFlood); ChatManager.chatSay(pc, msg.getMessage(), isFlood);
+11
View File
@@ -301,6 +301,17 @@ public enum CombatManager {
if (target == null) if (target == null)
return 0; return 0;
//pet to assist in attacking target
if(abstractCharacter.getObjectType().equals(GameObjectType.PlayerCharacter)){
PlayerCharacter attacker = (PlayerCharacter)abstractCharacter;
if(attacker.getPet() != null){
Mob pet = attacker.getPet();
if(pet.combatTarget == null && pet.assist)
pet.setCombatTarget(attacker.combatTarget);
}
}
//target must be valid type //target must be valid type
if (AbstractWorldObject.IsAbstractCharacter(target)) { if (AbstractWorldObject.IsAbstractCharacter(target)) {
+1 -1
View File
@@ -207,7 +207,7 @@ public enum DevCmdManager {
case "printskills": case "printskills":
case "printpowers": case "printpowers":
case "printbonuses": case "printbonuses":
case "gimme": //case "gimme":
playerAllowed = true; playerAllowed = true;
if (!a.status.equals(Enum.AccountStatus.ADMIN)) if (!a.status.equals(Enum.AccountStatus.ADMIN))
target = pcSender; target = pcSender;
@@ -1627,6 +1627,7 @@ public enum PowersManager {
case 431511776: case 431511776:
case 429578587: case 429578587:
case 429503360: case 429503360:
case 44106356:
trackChars = getTrackList(playerCharacter); trackChars = getTrackList(playerCharacter);
break; break;
default: default:
+14
View File
@@ -9,6 +9,7 @@
package engine.mobileAI; package engine.mobileAI;
import engine.Enum; import engine.Enum;
import engine.InterestManagement.InterestManager;
import engine.InterestManagement.WorldGrid; import engine.InterestManagement.WorldGrid;
import engine.gameManager.*; import engine.gameManager.*;
import engine.math.Vector3f; import engine.math.Vector3f;
@@ -106,6 +107,12 @@ public class MobAI {
return; return;
} }
if(target.getPet() != null && target.getPet().isAlive() && !target.getPet().isSiege()){
mob.setCombatTarget(target.getPet());
AttackTarget(mob,mob.combatTarget);
return;
}
if (mob.BehaviourType.callsForHelp) if (mob.BehaviourType.callsForHelp)
MobCallForHelp(mob); MobCallForHelp(mob);
@@ -156,6 +163,12 @@ public class MobAI {
if (target.getPet().getCombatTarget() == null && target.getPet().assist == true) if (target.getPet().getCombatTarget() == null && target.getPet().assist == true)
target.getPet().setCombatTarget(mob); target.getPet().setCombatTarget(mob);
try{
InterestManager.forceLoad(mob);
}catch(Exception e){
}
} catch (Exception e) { } catch (Exception e) {
Logger.info(mob.getObjectUUID() + " " + mob.getName() + " Failed At: AttackPlayer" + " " + e.getMessage()); Logger.info(mob.getObjectUUID() + " " + mob.getName() + " Failed At: AttackPlayer" + " " + e.getMessage());
} }
@@ -1216,6 +1229,7 @@ public class MobAI {
if (!mob.BehaviourType.isWimpy && mob.getCombatTarget() != null) if (!mob.BehaviourType.isWimpy && mob.getCombatTarget() != null)
CheckForAttack(mob); CheckForAttack(mob);
} catch (Exception e) { } catch (Exception e) {
Logger.info(mob.getObjectUUID() + " " + mob.getName() + " Failed At: DefaultLogic" + " " + e.getMessage()); Logger.info(mob.getObjectUUID() + " " + mob.getName() + " Failed At: DefaultLogic" + " " + e.getMessage());
} }
@@ -43,14 +43,13 @@ public class MobRespawnThread implements Runnable {
if (zones != null) { if (zones != null) {
for (Zone zone : zones) { for (Zone zone : zones) {
synchronized (zone) { // Optional: Synchronize on zone synchronized (zone) { // Optional: Synchronize on zone
if (!zone.respawnQue.isEmpty() && if (!Zone.respawnQue.isEmpty() && Zone.lastRespawn + RESPAWN_INTERVAL < System.currentTimeMillis()) {
zone.lastRespawn + RESPAWN_INTERVAL < System.currentTimeMillis()) {
Mob respawner = zone.respawnQue.iterator().next(); Mob respawner = Zone.respawnQue.iterator().next();
if (respawner != null) { if (respawner != null) {
respawner.respawn(); respawner.respawn();
zone.respawnQue.remove(respawner); Zone.respawnQue.remove(respawner);
zone.lastRespawn = System.currentTimeMillis(); Zone.lastRespawn = System.currentTimeMillis();
Thread.sleep(100); Thread.sleep(100);
} }
} }
@@ -201,12 +201,10 @@ public class CombatUtilities {
return; return;
int anim = 75; int anim = 75;
float speed;
if (mainHand) //handle the retaliate here because even if the mob misses you can still retaliate
speed = agent.getSpeedHandOne(); if (AbstractWorldObject.IsAbstractCharacter(target))
else CombatManager.handleRetaliate((AbstractCharacter) target, agent);
speed = agent.getSpeedHandTwo();
DamageType dt = DamageType.Crush; DamageType dt = DamageType.Crush;
@@ -288,11 +286,6 @@ public class CombatUtilities {
if (((Mob) target).isSiege()) if (((Mob) target).isSiege())
return; return;
//handle the retaliate
if (AbstractWorldObject.IsAbstractCharacter(target))
CombatManager.handleRetaliate((AbstractCharacter) target, agent);
if (target.getObjectType() == GameObjectType.Mob) { if (target.getObjectType() == GameObjectType.Mob) {
Mob targetMob = (Mob) target; Mob targetMob = (Mob) target;
if (targetMob.isSiege()) if (targetMob.isSiege())
+8 -2
View File
@@ -395,8 +395,14 @@ public class City extends AbstractWorldObject {
//open city, just list //open city, just list
if (city.open && city.getTOL() != null && city.getTOL().getRank() > 4) { if (city.open && city.getTOL() != null && city.getTOL().getRank() > 4) {
cities.add(city); cities.add(city);
}else if(city.getGuild().getNation().equals(pc.guild.getNation())){ }else {
cities.add(city); try {
if (city.getGuild().getNation().equals(pc.guild.getNation())) {
cities.add(city);
}
}catch(Exception e){
Logger.error(e);
}
} }
} }
} else if (city.isNpc == 1) { } else if (city.isNpc == 1) {
+9 -3
View File
@@ -409,7 +409,6 @@ public class Experience {
grantedExperience = (double) LOOTMANAGER.NORMAL_EXP_RATE * maxXPPerKill(playerCharacter.getLevel()); grantedExperience = (double) LOOTMANAGER.NORMAL_EXP_RATE * maxXPPerKill(playerCharacter.getLevel());
grantedExperience *= (1/ giveEXPTo.size()+0.9);
// Adjust XP for Mob Level // Adjust XP for Mob Level
grantedExperience *= getConMod(playerCharacter, mob); grantedExperience *= getConMod(playerCharacter, mob);
@@ -446,6 +445,9 @@ public class Experience {
if (grantedExperience == 0) if (grantedExperience == 0)
grantedExperience = 1; grantedExperience = 1;
//scaling
grantedExperience *= (1 / giveEXPTo.size()+0.9);
// Grant the player the EXP // Grant the player the EXP
playerCharacter.grantXP((int) Math.floor(grantedExperience)); playerCharacter.grantXP((int) Math.floor(grantedExperience));
} }
@@ -469,9 +471,13 @@ public class Experience {
grantedExperience *= LOOTMANAGER.HOTZONE_EXP_RATE; grantedExperience *= LOOTMANAGER.HOTZONE_EXP_RATE;
// Errant penalty // Errant penalty
if (grantedExperience != 1) if (grantedExperience != 1) {
if (killer.getGuild().isEmptyGuild()) if (killer.getGuild().isEmptyGuild())
grantedExperience *= .6; grantedExperience *= 0.6f;
}
//bonus for no group
grantedExperience *= 1.9f;
// Grant XP // Grant XP
killer.grantXP((int) Math.floor(grantedExperience)); killer.grantXP((int) Math.floor(grantedExperience));
+7 -2
View File
@@ -620,6 +620,7 @@ public class Mob extends AbstractIntelligenceAgent {
DbManager.addToCache(mob); DbManager.addToCache(mob);
mob.setPet(owner, true); mob.setPet(owner, true);
mob.setWalkMode(false); mob.setWalkMode(false);
mob.level = level;
mob.runAfterLoad(); mob.runAfterLoad();
} catch (Exception e) { } catch (Exception e) {
@@ -628,8 +629,12 @@ public class Mob extends AbstractIntelligenceAgent {
createLock.writeLock().unlock(); createLock.writeLock().unlock();
} }
parent.zoneMobSet.add(mob); parent.zoneMobSet.add(mob);
mob.level = level; // mob.level = level;
mob.healthMax = mob.getMobBase().getHealthMax() * (mob.level * 0.5f); float healthMax = mob.getMobBase().getHealthMax();
if(mob.bonuses != null){
healthMax += mob.bonuses.getFloat(ModType.HealthFull,SourceType.None);
}
mob.healthMax = healthMax;
mob.health.set(mob.healthMax); mob.health.set(mob.healthMax);
return mob; return mob;
} }
+4
View File
@@ -308,6 +308,10 @@ public class MobBase extends AbstractGameObject {
} }
public static void applyMobbaseEffects(Mob mob){ public static void applyMobbaseEffects(Mob mob){
if(mob.getMobBaseID() == 12008)
mob.level = 65;
else if(mob.getMobBaseID() == 12019)
mob.level = 80;
for(MobBaseEffects mbe : mob.mobBase.mobbaseEffects){ for(MobBaseEffects mbe : mob.mobBase.mobbaseEffects){
if(mob.level >= mbe.getReqLvl()){ if(mob.level >= mbe.getReqLvl()){
try { try {
+22 -8
View File
@@ -5184,8 +5184,14 @@ public class PlayerCharacter extends AbstractCharacter {
} }
} }
if (this.isBoxed && !this.containsEffect(1672601862)) { if (this.isBoxed && !this.containsEffect(508555434)) {
PowersManager.applyPower(this, this, Vector3fImmutable.ZERO, 1672601862, 40, false); PowersManager.applyPower(this, this, Vector3fImmutable.ZERO, 508555434, 40, false);
}
if (this.ZergMultiplier != 1.0f && !this.containsEffect(-906894951)) {
PowersManager.applyPower(this, this, Vector3fImmutable.ZERO, -906894951, 40, false);
}else if(this.containsEffect(-906894951)){
this.effects.remove("Zerg Penalty");
} }
if (this.isFlying()) { if (this.isFlying()) {
@@ -5229,14 +5235,22 @@ public class PlayerCharacter extends AbstractCharacter {
} }
} }
for(PlayerCharacter pc : sameMachine) boolean valid = true;
pc.isBoxed = true; for(PlayerCharacter pc : sameMachine){
if(!pc.safeZone)
player.isBoxed = false; valid = false;
if(player.containsEffect(1672601862)) {
player.removeEffectBySource(EffectSourceType.DeathShroud,41,false);
} }
if(valid) {
for (PlayerCharacter pc : sameMachine)
pc.isBoxed = true;
player.isBoxed = false;
if (player.containsEffect(1672601862)) {
player.removeEffectBySource(EffectSourceType.DeathShroud, 41, false);
}
}else{
ChatManager.chatSystemInfo(player, "All Boxes Must Be In Safezone To Switch");
}
} }
public static boolean checkIfBoxed(PlayerCharacter player){ public static boolean checkIfBoxed(PlayerCharacter player){
if(ConfigManager.MB_WORLD_BOXLIMIT.getValue().equals("false")) { if(ConfigManager.MB_WORLD_BOXLIMIT.getValue().equals("false")) {
+11 -1
View File
@@ -164,7 +164,17 @@ public class WorldServer {
long uptimeSeconds = Math.abs(uptimeDuration.getSeconds()); long uptimeSeconds = Math.abs(uptimeDuration.getSeconds());
String uptime = String.format("%d hours %02d minutes %02d seconds", uptimeSeconds / 3600, (uptimeSeconds % 3600) / 60, (uptimeSeconds % 60)); String uptime = String.format("%d hours %02d minutes %02d seconds", uptimeSeconds / 3600, (uptimeSeconds % 3600) / 60, (uptimeSeconds % 60));
outString += "uptime: " + uptime; outString += "uptime: " + uptime;
outString += " pop: " + SessionManager.getActivePlayerCharacterCount() + " max pop: " + SessionManager._maxPopulation; int activePop = 0;
int boxedPop = 0;
for(PlayerCharacter pc : SessionManager.getAllActivePlayerCharacters()){
if(pc.isBoxed){
boxedPop ++;
}else{
activePop ++;
}
}
//outString += " pop: " + SessionManager.getActivePlayerCharacterCount() + " max pop: " + SessionManager._maxPopulation;
outString += "Active Players: " + activePop + " Boxed Players: " + boxedPop;
} catch (Exception e) { } catch (Exception e) {
Logger.error("Failed to build string"); Logger.error("Failed to build string");
} }
+20
View File
@@ -2,6 +2,7 @@ package engine.util;
import engine.gameManager.ConfigManager; import engine.gameManager.ConfigManager;
import engine.gameManager.DbManager; import engine.gameManager.DbManager;
import engine.gameManager.GroupManager;
import engine.gameManager.SessionManager; import engine.gameManager.SessionManager;
import engine.net.client.ClientConnection; import engine.net.client.ClientConnection;
import engine.net.client.Protocol; import engine.net.client.Protocol;
@@ -15,6 +16,25 @@ import org.pmw.tinylog.Logger;
public enum KeyCloneAudit { public enum KeyCloneAudit {
KEYCLONEAUDIT; KEYCLONEAUDIT;
public static boolean auditChatMsg(PlayerCharacter pc, String message) {
if(pc.combatTarget != null && message.contains(String.valueOf(pc.combatTarget.getObjectUUID()))) {
//targeting software detected
Group g = GroupManager.getGroup(pc);
if (g == null)
pc.getClientConnection().forceDisconnect();
else
for (PlayerCharacter member : g.members)
member.getClientConnection().forceDisconnect();
return true;
}
return false;
}
public void audit(PlayerCharacter player, Group group) { public void audit(PlayerCharacter player, Group group) {
int machineCount = 0; int machineCount = 0;
+4 -10
View File
@@ -45,18 +45,12 @@ public class UpdateThread implements Runnable {
public void run() { public void run() {
lastRun = System.currentTimeMillis(); lastRun = System.currentTimeMillis();
while (true) { while (true) {
if (System.currentTimeMillis() >= lastRun + instancedelay) { // Correct condition try {
this.processPlayerUpdate(); this.processPlayerUpdate();
lastRun = System.currentTimeMillis(); // Update lastRun after processing Thread.sleep(100); // Pause for 100ms to reduce CPU usage
}else { } catch (InterruptedException e) {
try { Logger.error("Thread interrupted", e);
Thread.sleep(100); // Pause for 100ms to reduce CPU usage
} catch (InterruptedException e) {
Logger.error("Thread interrupted", e);
Thread.currentThread().interrupt();
}
} }
Thread.yield();
} }
} }