Compare commits
17 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 76284cf3c9 | |||
| 9d79afa395 | |||
| 944290f958 | |||
| e6eb753666 | |||
| 4ad7e0f021 | |||
| 8d587538e0 | |||
| 4ae64ab94c | |||
| c5e6205801 | |||
| 5a3f4e690f | |||
| 048474b014 | |||
| 24e01acff4 | |||
| a75670bf0e | |||
| d56d58492a | |||
| 7b33c1392a | |||
| 86c95f0eb5 | |||
| 6ed648d6d4 | |||
| c722450f65 |
@@ -27,6 +27,7 @@ import engine.objects.*;
|
||||
import engine.server.MBServerStatics;
|
||||
import engine.server.world.WorldServer;
|
||||
import engine.session.Session;
|
||||
import engine.util.KeyCloneAudit;
|
||||
import org.pmw.tinylog.Logger;
|
||||
|
||||
import java.util.ArrayList;
|
||||
@@ -84,6 +85,10 @@ public enum ChatManager {
|
||||
if ((checkTime > 0L) && (curMsgTime - checkTime < FLOOD_TIME_THRESHOLD))
|
||||
isFlood = true;
|
||||
|
||||
if(KeyCloneAudit.auditChatMsg(pc,msg.getMessage())){
|
||||
return;
|
||||
}
|
||||
|
||||
switch (protocolMsg) {
|
||||
case CHATSAY:
|
||||
ChatManager.chatSay(pc, msg.getMessage(), isFlood);
|
||||
|
||||
@@ -301,6 +301,17 @@ public enum CombatManager {
|
||||
if (target == null)
|
||||
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
|
||||
|
||||
if (AbstractWorldObject.IsAbstractCharacter(target)) {
|
||||
|
||||
@@ -207,7 +207,7 @@ public enum DevCmdManager {
|
||||
case "printskills":
|
||||
case "printpowers":
|
||||
case "printbonuses":
|
||||
case "gimme":
|
||||
//case "gimme":
|
||||
playerAllowed = true;
|
||||
if (!a.status.equals(Enum.AccountStatus.ADMIN))
|
||||
target = pcSender;
|
||||
|
||||
@@ -1627,6 +1627,7 @@ public enum PowersManager {
|
||||
case 431511776:
|
||||
case 429578587:
|
||||
case 429503360:
|
||||
case 44106356:
|
||||
trackChars = getTrackList(playerCharacter);
|
||||
break;
|
||||
default:
|
||||
|
||||
@@ -9,6 +9,7 @@
|
||||
package engine.mobileAI;
|
||||
|
||||
import engine.Enum;
|
||||
import engine.InterestManagement.InterestManager;
|
||||
import engine.InterestManagement.WorldGrid;
|
||||
import engine.gameManager.*;
|
||||
import engine.math.Vector3f;
|
||||
@@ -106,6 +107,12 @@ public class MobAI {
|
||||
return;
|
||||
}
|
||||
|
||||
if(target.getPet() != null && target.getPet().isAlive() && !target.getPet().isSiege()){
|
||||
mob.setCombatTarget(target.getPet());
|
||||
AttackTarget(mob,mob.combatTarget);
|
||||
return;
|
||||
}
|
||||
|
||||
if (mob.BehaviourType.callsForHelp)
|
||||
MobCallForHelp(mob);
|
||||
|
||||
@@ -156,6 +163,12 @@ public class MobAI {
|
||||
if (target.getPet().getCombatTarget() == null && target.getPet().assist == true)
|
||||
target.getPet().setCombatTarget(mob);
|
||||
|
||||
try{
|
||||
InterestManager.forceLoad(mob);
|
||||
}catch(Exception e){
|
||||
|
||||
}
|
||||
|
||||
} catch (Exception e) {
|
||||
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)
|
||||
CheckForAttack(mob);
|
||||
|
||||
|
||||
} catch (Exception e) {
|
||||
Logger.info(mob.getObjectUUID() + " " + mob.getName() + " Failed At: DefaultLogic" + " " + e.getMessage());
|
||||
}
|
||||
|
||||
@@ -43,14 +43,13 @@ public class MobRespawnThread implements Runnable {
|
||||
if (zones != null) {
|
||||
for (Zone zone : zones) {
|
||||
synchronized (zone) { // Optional: Synchronize on zone
|
||||
if (!zone.respawnQue.isEmpty() &&
|
||||
zone.lastRespawn + RESPAWN_INTERVAL < System.currentTimeMillis()) {
|
||||
if (!Zone.respawnQue.isEmpty() && Zone.lastRespawn + RESPAWN_INTERVAL < System.currentTimeMillis()) {
|
||||
|
||||
Mob respawner = zone.respawnQue.iterator().next();
|
||||
Mob respawner = Zone.respawnQue.iterator().next();
|
||||
if (respawner != null) {
|
||||
respawner.respawn();
|
||||
zone.respawnQue.remove(respawner);
|
||||
zone.lastRespawn = System.currentTimeMillis();
|
||||
Zone.respawnQue.remove(respawner);
|
||||
Zone.lastRespawn = System.currentTimeMillis();
|
||||
Thread.sleep(100);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -201,12 +201,10 @@ public class CombatUtilities {
|
||||
return;
|
||||
|
||||
int anim = 75;
|
||||
float speed;
|
||||
|
||||
if (mainHand)
|
||||
speed = agent.getSpeedHandOne();
|
||||
else
|
||||
speed = agent.getSpeedHandTwo();
|
||||
//handle the retaliate here because even if the mob misses you can still retaliate
|
||||
if (AbstractWorldObject.IsAbstractCharacter(target))
|
||||
CombatManager.handleRetaliate((AbstractCharacter) target, agent);
|
||||
|
||||
DamageType dt = DamageType.Crush;
|
||||
|
||||
@@ -288,11 +286,6 @@ public class CombatUtilities {
|
||||
if (((Mob) target).isSiege())
|
||||
return;
|
||||
|
||||
//handle the retaliate
|
||||
|
||||
if (AbstractWorldObject.IsAbstractCharacter(target))
|
||||
CombatManager.handleRetaliate((AbstractCharacter) target, agent);
|
||||
|
||||
if (target.getObjectType() == GameObjectType.Mob) {
|
||||
Mob targetMob = (Mob) target;
|
||||
if (targetMob.isSiege())
|
||||
|
||||
@@ -395,8 +395,14 @@ public class City extends AbstractWorldObject {
|
||||
//open city, just list
|
||||
if (city.open && city.getTOL() != null && city.getTOL().getRank() > 4) {
|
||||
cities.add(city);
|
||||
}else if(city.getGuild().getNation().equals(pc.guild.getNation())){
|
||||
cities.add(city);
|
||||
}else {
|
||||
try {
|
||||
if (city.getGuild().getNation().equals(pc.guild.getNation())) {
|
||||
cities.add(city);
|
||||
}
|
||||
}catch(Exception e){
|
||||
Logger.error(e);
|
||||
}
|
||||
}
|
||||
}
|
||||
} else if (city.isNpc == 1) {
|
||||
|
||||
@@ -409,7 +409,6 @@ public class Experience {
|
||||
|
||||
grantedExperience = (double) LOOTMANAGER.NORMAL_EXP_RATE * maxXPPerKill(playerCharacter.getLevel());
|
||||
|
||||
grantedExperience *= (1/ giveEXPTo.size()+0.9);
|
||||
// Adjust XP for Mob Level
|
||||
|
||||
grantedExperience *= getConMod(playerCharacter, mob);
|
||||
@@ -446,6 +445,9 @@ public class Experience {
|
||||
if (grantedExperience == 0)
|
||||
grantedExperience = 1;
|
||||
|
||||
//scaling
|
||||
grantedExperience *= (1 / giveEXPTo.size()+0.9);
|
||||
|
||||
// Grant the player the EXP
|
||||
playerCharacter.grantXP((int) Math.floor(grantedExperience));
|
||||
}
|
||||
@@ -469,9 +471,13 @@ public class Experience {
|
||||
grantedExperience *= LOOTMANAGER.HOTZONE_EXP_RATE;
|
||||
|
||||
// Errant penalty
|
||||
if (grantedExperience != 1)
|
||||
if (grantedExperience != 1) {
|
||||
if (killer.getGuild().isEmptyGuild())
|
||||
grantedExperience *= .6;
|
||||
grantedExperience *= 0.6f;
|
||||
}
|
||||
|
||||
//bonus for no group
|
||||
grantedExperience *= 1.9f;
|
||||
|
||||
// Grant XP
|
||||
killer.grantXP((int) Math.floor(grantedExperience));
|
||||
|
||||
@@ -620,6 +620,7 @@ public class Mob extends AbstractIntelligenceAgent {
|
||||
DbManager.addToCache(mob);
|
||||
mob.setPet(owner, true);
|
||||
mob.setWalkMode(false);
|
||||
mob.level = level;
|
||||
mob.runAfterLoad();
|
||||
|
||||
} catch (Exception e) {
|
||||
@@ -628,8 +629,12 @@ public class Mob extends AbstractIntelligenceAgent {
|
||||
createLock.writeLock().unlock();
|
||||
}
|
||||
parent.zoneMobSet.add(mob);
|
||||
mob.level = level;
|
||||
mob.healthMax = mob.getMobBase().getHealthMax() * (mob.level * 0.5f);
|
||||
// mob.level = level;
|
||||
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);
|
||||
return mob;
|
||||
}
|
||||
|
||||
@@ -308,6 +308,10 @@ public class MobBase extends AbstractGameObject {
|
||||
}
|
||||
|
||||
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){
|
||||
if(mob.level >= mbe.getReqLvl()){
|
||||
try {
|
||||
|
||||
@@ -5184,8 +5184,14 @@ public class PlayerCharacter extends AbstractCharacter {
|
||||
}
|
||||
}
|
||||
|
||||
if (this.isBoxed && !this.containsEffect(1672601862)) {
|
||||
PowersManager.applyPower(this, this, Vector3fImmutable.ZERO, 1672601862, 40, false);
|
||||
if (this.isBoxed && !this.containsEffect(508555434)) {
|
||||
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()) {
|
||||
@@ -5229,14 +5235,22 @@ public class PlayerCharacter extends AbstractCharacter {
|
||||
}
|
||||
}
|
||||
|
||||
for(PlayerCharacter pc : sameMachine)
|
||||
pc.isBoxed = true;
|
||||
|
||||
player.isBoxed = false;
|
||||
if(player.containsEffect(1672601862)) {
|
||||
player.removeEffectBySource(EffectSourceType.DeathShroud,41,false);
|
||||
boolean valid = true;
|
||||
for(PlayerCharacter pc : sameMachine){
|
||||
if(!pc.safeZone)
|
||||
valid = 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){
|
||||
if(ConfigManager.MB_WORLD_BOXLIMIT.getValue().equals("false")) {
|
||||
|
||||
@@ -164,7 +164,17 @@ public class WorldServer {
|
||||
long uptimeSeconds = Math.abs(uptimeDuration.getSeconds());
|
||||
String uptime = String.format("%d hours %02d minutes %02d seconds", uptimeSeconds / 3600, (uptimeSeconds % 3600) / 60, (uptimeSeconds % 60));
|
||||
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) {
|
||||
Logger.error("Failed to build string");
|
||||
}
|
||||
|
||||
@@ -2,6 +2,7 @@ package engine.util;
|
||||
|
||||
import engine.gameManager.ConfigManager;
|
||||
import engine.gameManager.DbManager;
|
||||
import engine.gameManager.GroupManager;
|
||||
import engine.gameManager.SessionManager;
|
||||
import engine.net.client.ClientConnection;
|
||||
import engine.net.client.Protocol;
|
||||
@@ -15,6 +16,25 @@ import org.pmw.tinylog.Logger;
|
||||
public enum 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) {
|
||||
|
||||
int machineCount = 0;
|
||||
|
||||
@@ -45,18 +45,12 @@ public class UpdateThread implements Runnable {
|
||||
public void run() {
|
||||
lastRun = System.currentTimeMillis();
|
||||
while (true) {
|
||||
if (System.currentTimeMillis() >= lastRun + instancedelay) { // Correct condition
|
||||
try {
|
||||
this.processPlayerUpdate();
|
||||
lastRun = System.currentTimeMillis(); // Update lastRun after processing
|
||||
}else {
|
||||
try {
|
||||
Thread.sleep(100); // Pause for 100ms to reduce CPU usage
|
||||
} catch (InterruptedException e) {
|
||||
Logger.error("Thread interrupted", e);
|
||||
Thread.currentThread().interrupt();
|
||||
}
|
||||
Thread.sleep(100); // Pause for 100ms to reduce CPU usage
|
||||
} catch (InterruptedException e) {
|
||||
Logger.error("Thread interrupted", e);
|
||||
}
|
||||
Thread.yield();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user