Keep takeoff clearance until actual ascent, blacklist rejected dynamic bridges, and diagnose group ground-path rejection. Synchronize native Wintergrasp client mount permission with battle state and fix duplicate Zangarmarsh graveyard ownership. Add regression tests and generic testbot aura inspection.
40 lines
2.9 KiB
Python
40 lines
2.9 KiB
Python
"""Run production WG client permission synchronization and battle refresh."""
|
|
from pathlib import Path
|
|
import subprocess,tempfile
|
|
root=Path(__file__).resolve().parents[2]
|
|
s=(root/"src/server/game/Battlefield/BattlefieldMgr.cpp").read_text()
|
|
a=s.index("void BattlefieldMgr::UpdateWintergraspFlight(Player*")
|
|
b=s.index("\nBattlefield* BattlefieldMgr::GetBattlefieldToZoneId",a)
|
|
code=r'''
|
|
#include <cassert>
|
|
#include <vector>
|
|
#include <set>
|
|
using uint32=unsigned;
|
|
constexpr unsigned SPELL_AURA_MOUNT_RESTRICTIONS=336;
|
|
enum class AreaMountFlags:unsigned{AllowFlyingMounts=2};
|
|
struct AuraEffect {unsigned id,misc;unsigned GetId()const{return id;}int GetMiscValue()const{return misc;}};
|
|
struct Player {unsigned zone=4197,area=4197,map=571;int casts=0,updates=0;std::set<unsigned> auras;std::vector<AuraEffect const*> effects;
|
|
unsigned GetMapId()const{return map;}unsigned GetAreaId()const{return area;}unsigned GetZoneId()const{return zone;}
|
|
auto const& GetAuraEffectsByType(unsigned)const{return effects;}bool HasAura(unsigned id)const{return auras.count(id);}
|
|
void AddAura(unsigned id,Player*){auras.insert(id);++casts;}void RemoveAurasDueToSpell(unsigned id){auras.erase(id);}void UpdateMountCapability(){++updates;}};
|
|
struct Reference {Player* player;Player* GetSource()const{return player;}};
|
|
struct Map {std::vector<Reference> players;auto const& GetPlayers()const{return players;}};
|
|
struct BattlefieldMgr {bool permitted=true;bool IsWintergraspFlightAllowed(unsigned map,unsigned area)const{return permitted&&map==571&&(area==4197||area==4538);}void UpdateWintergraspFlight(Player*)const;void UpdateWintergraspFlight(Map*)const;};
|
|
'''+s[a:b]+r'''
|
|
int main(){BattlefieldMgr m;Player p,out;out.zone=210;out.area=210;Map map{{{&p},{&out}}};
|
|
m.UpdateWintergraspFlight(&map);assert(p.HasAura(91262)&&p.casts==1&&p.updates==1&&!out.HasAura(91262));
|
|
AuraEffect own{91262,15};p.effects={&own};m.UpdateWintergraspFlight(&p);assert(p.casts==1&&p.HasAura(91262));
|
|
m.permitted=false;m.UpdateWintergraspFlight(&map);assert(!p.HasAura(91262)&&p.updates==2);
|
|
m.permitted=true;m.UpdateWintergraspFlight(&map);assert(p.HasAura(91262)&&p.casts==2);
|
|
p.area=4538;m.UpdateWintergraspFlight(&p);assert(p.HasAura(91262));
|
|
p.area=210;m.UpdateWintergraspFlight(&p);assert(!p.HasAura(91262));
|
|
p.area=4197;AuraEffect restriction{91124,13};p.effects={&restriction};m.UpdateWintergraspFlight(&p);assert(!p.HasAura(91262));
|
|
AuraEffect permission{86973,15};p.effects={&permission};m.UpdateWintergraspFlight(&p);assert(p.HasAura(91262));
|
|
p.effects={&own,&restriction};m.UpdateWintergraspFlight(&p);assert(!p.HasAura(91262));}
|
|
'''
|
|
with tempfile.TemporaryDirectory(prefix="vcore-wg-client-permission-") as d:
|
|
p=Path(d);(p/"test.cpp").write_text(code)
|
|
subprocess.run(["c++","-std=c++17",str(p/"test.cpp"),"-o",str(p/"test")],check=True)
|
|
subprocess.run([str(p/"test")],check=True)
|
|
print("WG permission: entry/subarea/idempotence/battle start/end/exit/aura precedence PASS")
|