Emberveil sourcetests/PkingCheck.java
import com.rs2.Constants;
import com.rs2.GameEngine;
import com.rs2.game.players.*;
import com.rs2.game.npcs.*;
import com.rs2.game.items.ItemDefinitions;
import org.apollo.cache.IndexedFileSystem;
import org.apollo.cache.decoder.ItemDefinitionDecoder;
import org.apollo.cache.def.ItemDefinition;
import java.nio.file.Paths;
import java.util.Arrays;
import com.rs2.game.content.combat.magic.MagicData;
/** Real server combat checks; disposable in-memory players, no character saves. */
public final class PkingCheck {
static int passed,failed;
static void check(boolean value,String label) {System.out.println((value?"PASS: ":"FAIL: ")+label);if(value)passed++;else failed++;}
static class Fighter extends Client {
Fighter(int id) {super(null,id);getOutStream().packetEncryption=new org.apollo.util.security.IsaacRandom(new int[]{1,2,3,4});
playerName=playerName2="pkqa"+id; tutorialProgress=36; wildernessWarning=true;
Arrays.fill(playerEquipment,-1);Arrays.fill(playerLevel,99);Arrays.fill(playerXP,13034431);specAccuracy=1;specDamage=1;}
public void flushOutStream(){getOutStream().currentOffset=0;}
}
static void reset(Fighter a,Fighter b) {
a.getOutStream().currentOffset=b.getOutStream().currentOffset=0;
a.absX=b.absX=3090;a.absY=3956;b.absY=3955;
a.heightLevel=b.heightLevel=0;a.combatLevel=b.combatLevel=126;a.wildLevel=b.wildLevel=55;
a.playerIndex=2;b.playerIndex=1;a.underAttackBy=b.underAttackBy=0;a.underAttackBy2=b.underAttackBy2=0;
a.playerLevel[3]=b.playerLevel[3]=99;b.playerLevel[1]=0;
Arrays.fill(a.playerBonus,0);Arrays.fill(b.playerBonus,0);Arrays.fill(a.getPrayer().prayerActive,false);Arrays.fill(b.getPrayer().prayerActive,false);
Arrays.fill(a.playerEquipment,-1);Arrays.fill(b.playerEquipment,-1);
a.specAmount=10;a.specAccuracy=a.specDamage=1;a.specEffect=0;a.recoilHits=b.recoilHits=0;
a.isDead=b.isDead=false;a.castingMagic=false;a.projectileStage=0;a.bowSpecShot=0;
}
public static void main(String[] args)throws Exception {
new ItemDefinitionDecoder(new IndexedFileSystem(Paths.get("data/cache"),true)).run();ItemDefinitions.load();
check(GameEngine.npcHandler!=null,"world handlers load");
Fighter a=new Fighter(1),b=new Fighter(2);PlayerHandler.players[1]=a;PlayerHandler.players[2]=b;
reset(a,b);check(a.getCombatAssistant().checkReqs(),"equal levels can fight at Mage Bank lever");
reset(a,b);b.absX=2539;b.absY=4712;check(!a.getCombatAssistant().checkReqs(),"Mage Bank interior is safe from Wilderness attacks");
reset(a,b);a.combatLevel=60;check(!a.getCombatAssistant().checkReqs(),"Wilderness level difference enforced");
reset(a,b);b.heightLevel=1;check(!a.getCombatAssistant().checkReqs(),"players on different floors cannot attack");
reset(a,b);b.underAttackBy=3;check(!a.getCombatAssistant().checkReqs(),"single combat blocks third player");
reset(a,b);a.playerEquipment[3]=4151;a.specAmount=4.9;check(!a.getCombatAssistant().checkSpecAmount(4151)&&a.specAmount==4.9,"whip spec rejects insufficient energy");
a.specAmount=10;check(a.getCombatAssistant().checkSpecAmount(4151)&&a.specAmount==5,"whip consumes 50 percent energy");
reset(a,b);a.playerEquipment[3]=5698;for(int i=0;i<4;i++)check(a.getCombatAssistant().checkSpecAmount(5698),"dagger spec charge "+(i+1));
check(!a.getCombatAssistant().checkSpecAmount(5698)&&a.specAmount==0,"fifth dagger spec blocked");
reset(a,b);check(!a.getCombatAssistant().checkSpecAmount(11700)&&a.specAmount==10,"unsupported special rejected rather than free");
reset(a,b);a.playerEquipment[3]=4587;a.getSpecials().activateSpecial(4587,b,2);check(a.specEffect==1,"dragon scimitar special activates prayer-disabling effect");
b.getPrayer().prayerActive[18]=true;b.protMeleeDelay=0;a.delayedDamage=10;
a.getCombatAssistant().applyPlayerMeleeDamage(2,1);
check(!b.getPrayer().prayerActive[18],"successful dragon scimitar special disables protection prayer");
reset(a,b);a.delayedDamage=50;a.getCombatAssistant().applyPlayerMeleeDamage(2,1);check(b.playerLevel[3]==49,"unprotected melee applies 50 damage");
reset(a,b);b.getPrayer().prayerActive[18]=true;b.protMeleeDelay=0;a.delayedDamage=50;a.getCombatAssistant().applyPlayerMeleeDamage(2,1);check(b.playerLevel[3]==69,"established melee protection reduces damage by 40 percent");
reset(a,b);b.playerEquipment[b.playerRing]=2550;a.getCombatAssistant().applyRecoil(a,20,2);
check(a.playerLevel[3]==96,"defender recoil reflects damage to attacker");
check(b.playerEquipment[b.playerRing]==2550 && a.playerEquipment[a.playerRing]==-1,"recoil preserves correct player's ring");
check(b.recoilHits==20 && a.recoilHits==0,"recoil durability belongs to wearer");
b.recoilHits=380;Arrays.fill(b.playerItems,1512);Arrays.fill(b.playerItemsN,1);
a.getCombatAssistant().applyRecoil(a,20,2);
check(b.playerEquipment[b.playerRing]==-1 && b.recoilHits==0,"recoil ring breaks at durability limit with full inventory");
check(Arrays.stream(b.playerItems).allMatch(item -> item==1512),"ring break preserves full inventory");
reset(a,b);a.tutorialProgress=36;a.teleBlockDelay=System.currentTimeMillis();a.teleBlockLength=300000;
a.getPlayerAssistant().startTeleport2(2539,4712,0);check(a.teleTimer==0,"teleblock prevents Mage Bank escape teleport");
reset(a,b);b.absX=2539;b.absY=4712;b.getNpcs().secondClickNpc(902);check(b.isBanking,"Gundai bank action opens bank");
int bankers=0,runes=0;for(Npc n:NpcHandler.npcs)if(n!=null&&n.absX>=2530&&n.absX<=2550&&n.absY>=4705&&n.absY<=4725){if(n.npcType==902)bankers++;if(n.npcType==903)runes++;}
check(bankers==1,"Mage Bank has exactly one Gundai spawn");check(runes>0,"Mage Bank has Lundail rune shop spawn");
System.out.println("CACHE ITEM COUNT: "+ItemDefinition.count());
int ice=-1;for(int n=0;n<MagicData.MAGIC_SPELLS.length;n++)if(MagicData.MAGIC_SPELLS[n][0]==12891)ice=n;
check(ice>=0,"Ice Barrage spell exists");
for(boolean magic:new boolean[]{false,true})for(boolean protect:new boolean[]{false,true}) {
boolean bounded=true;int total=0,largest=0;
for(int trial=0;trial<250;trial++) {
reset(a,b);a.projectileStage=2;a.castingMagic=magic;a.oldSpellId=ice;
a.usingBow=true;a.lastWeaponUsed=4212;a.lastArrowUsed=4212;
b.getPrayer().prayerActive[magic?16:17]=protect;b.protMageDelay=b.protRangeDelay=0;
int cap=magic?30:a.getCombatAssistant().rangeMaxHit();if(protect)cap=cap*60/100;
a.getCombatAssistant().playerDelayedHit(2);
int damage=99-b.playerLevel[3];bounded &= damage>=0&&damage<=cap;
total+=damage;largest=Math.max(largest,damage);
}
check(bounded&&total>0,(magic?"magic":"ranged")+" damage stays within "+(protect?"protected":"normal")+" cap across 250 real hit callbacks");
System.out.println("HIT SAMPLE "+(magic?"Ice Barrage":"crystal bow")+" protection="+protect+" highest="+largest+" average="+(total/250.0));
}
for(int id:new int[]{11694,11696,11698,11700,11716,11724,11726,11718,11720,11722}) {
System.out.println("GWD ASSET "+id+": "+(id<ItemDefinition.count()?ItemDefinition.lookup(id).getName():"NOT PRESENT"));
}
System.out.println("PK CHECKS: "+passed+" passed, "+failed+" failed");
if(failed>0)System.exit(1);
}
}