diff --git a/.agents/skills/metin2-40250-parity-audit/scripts/platform_stub.py b/.agents/skills/metin2-40250-parity-audit/scripts/platform_stub.py index ce31e597..ce7500f0 100644 --- a/.agents/skills/metin2-40250-parity-audit/scripts/platform_stub.py +++ b/.agents/skills/metin2-40250-parity-audit/scripts/platform_stub.py @@ -5,6 +5,12 @@ platform_stub.py gen [
...] [--force] write extension/src/platform//.cpp (no args: every platform header; never overwrites without --force, so hand-written implementations stay) + platform_stub.py pending
... [--ctor] + append stubs of just those members (the linker's + undefined-symbol names, demangled as ld prints them) to the stand-in of a not-yet-ported + logic unit, extension/src/platform/pending//.cpp; + --ctor adds the class constructor/destructor so the + singleton can exist (its members still default-construct) `
` is a mirror path such as `EterLib/GrpBase.h`. A header is platform-layer when its same-stem 40250 .cpp unit is (port_map.py LAYER_PATTERNS), or, without one, when its own path matches. @@ -262,11 +268,13 @@ class Collector: and not node.get("inline"): self.add("fn", f"{scope}{node['name']}", node) - def render(self) -> list[str]: + def render(self, only=None) -> list[str]: out = [] for kind, qname, node in self.decls: if node.get("mangledName") in self.defined: continue + if only is not None and not only(qname, node): + continue if kind == "var": out.append(f"decltype({qname}) {qname}{{}};\n") else: @@ -288,7 +296,8 @@ def namespaces(header: Path) -> dict[str, str]: return result -def generate(rel: str) -> str: +def generate(rel: str, only=None) -> str: + """The skeleton of `rel`; with `only(qname, node)`, just the declarations it accepts (the bodies alone).""" header = PORT / rel records, functions = scan(header) args, tu = gate_command(rel) @@ -304,9 +313,9 @@ def generate(rel: str) -> str: for n in nodes: if n.get("name") == name: col.root(n, ns.get(name, "")) - body = col.render() - if not body: - return "" + body = col.render(only) + if not body or only is not None: + return "\n".join(body) lib = rel.split("/")[0] stdafx = next((p.name for p in (PORT / lib).glob("*") if p.name.lower() == "stdafx.h"), None) unit = unit_of(rel) @@ -382,6 +391,44 @@ def cmd_gen(args) -> int: return 0 +def cmd_pending(args) -> int: + rel = next((h.relative_to(PORT).as_posix() for h in PORT.rglob("*.h") + if h.relative_to(PORT).as_posix().lower() == args.header.lower()), None) + if not rel: + raise SystemExit(f"{args.header}: not in the mirror") + wanted = {s.strip().strip('"') for s in args.symbols} + demangled: dict[str, str] = {} + + def only(qname: str, node: dict) -> bool: + mangled = node.get("mangledName", "") + if mangled not in demangled: + demangled[mangled] = subprocess.run(["c++filt", mangled], capture_output=True, text=True).stdout.strip() + if demangled[mangled] in wanted: + return True + return args.ctor and node.get("kind") in ("CXXConstructorDecl", "CXXDestructorDecl") \ + and qname.split("::")[-2:-1] == [node.get("name", "").lstrip("~")] and qname.count("::") == 1 + body = generate(rel, only) + if not body: + print(f"none {rel} (no such undefined member)") + return 0 + path = PLATFORM / "pending" / (rel.rsplit(".", 1)[0] + ".cpp") + if path.exists(): + text = path.read_text(encoding="utf-8").rstrip("\n") + "\n\n" + body + else: + lib = rel.split("/")[0] + stdafx = next((p.name for p in (PORT / lib).glob("*") if p.name.lower() == "stdafx.h"), None) + unit = unit_of(rel) or rel + text = (f"// Stand-in for the 40250 logic unit {unit}, not ported yet: the members the ported units\n" + f"// reference, as {MARK} stubs. Delete this file in the commit that ports the unit into port/\n" + f"// (docs/PORT-PLAN.md).\n" + + (f'#include "{lib}/{stdafx}"\n' if stdafx else "") + + f'#include "{rel}"\n\n#include "{"../" * (rel.count("/") + 1)}PlatformStub.h"\n\n' + body) + path.parent.mkdir(parents=True, exist_ok=True) + path.write_text(text, encoding="utf-8") + print(f"wrote {path.relative_to(REPO)} (+{body.count('MT_PLATFORM_STUB();')} stubs)") + return 0 + + def main() -> int: ap = argparse.ArgumentParser(description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter) sub = ap.add_subparsers(dest="cmd", required=True) @@ -390,6 +437,11 @@ def main() -> int: g.add_argument("headers", nargs="*") g.add_argument("--force", action="store_true") g.set_defaults(fn=cmd_gen) + p = sub.add_parser("pending") + p.add_argument("header") + p.add_argument("symbols", nargs="*") + p.add_argument("--ctor", action="store_true") + p.set_defaults(fn=cmd_pending) args = ap.parse_args() return args.fn(args) diff --git a/.agents/skills/metin2-40250-parity-audit/scripts/port_copy.py b/.agents/skills/metin2-40250-parity-audit/scripts/port_copy.py index 00e28acf..4b56917c 100644 --- a/.agents/skills/metin2-40250-parity-audit/scripts/port_copy.py +++ b/.agents/skills/metin2-40250-parity-audit/scripts/port_copy.py @@ -9,7 +9,8 @@ Mechanical edits, and nothing else: - CP949 is decoded and written as UTF-8 (comments are Korean). A non-ASCII string or character - literal would change bytes at runtime, so such a file is refused and must be handled by hand. + literal would change bytes at runtime, so its non-ASCII characters are written as their CP949 + bytes in 3-digit octal escapes (`"\301\326..."`): the compiled bytes stay those of 40250. - CRLF becomes LF. - `#include "..."` paths get the on-disk case of the file they name (40250 builds on a case-insensitive file system and writes `../eterLib/StdAfx.h`, `Parser.h` for `parser.h`, ...), @@ -77,9 +78,12 @@ def mechanical(ref: Path, index: dict[str, Path], src: Path) -> str: raise SystemExit(f"{src.relative_to(ref)}: not CP949 ({e})") text = text.replace("\r\n", "\n").lstrip("") code = COMMENT.sub(lambda m: " " * len(m.group(0)), text) - bad = [m.group(0) for m in LITERAL.finditer(code) if not m.group(0).isascii()] - if bad: - raise SystemExit(f"{src.relative_to(ref)}: non-ASCII literal(s), copy by hand: {bad[:3]}") + # Literals are found with comments blanked out; offsets are the same in `text`. + for m in reversed(list(LITERAL.finditer(code))): + if not m.group(0).isascii(): + escaped = "".join(c if c.isascii() else "".join(f"\\{b:03o}" for b in c.encode("cp949")) + for c in m.group(0)) + text = text[:m.start()] + escaped + text[m.end():] return INCLUDE.sub(lambda m: m.group(1) + fix_include(ref, index, src, m.group(2)) + m.group(3), text) diff --git a/audit/history.jsonl b/audit/history.jsonl index 8ac5ac74..1a679e9e 100644 --- a/audit/history.jsonl +++ b/audit/history.jsonl @@ -513,3 +513,4 @@ {"time": "2026-09-23T06:23:33Z", "event": "port_round", "unit": "PORT-PLAN 2V1-e: live smoke harness (port.login_live)", "ported": [], "adapted": ["port_login_flow_test live mode: server and account from MT_LIVE_* env vars only, passed to Python as objects, never printed"], "divergent": [], "needs_live": ["login -> character list -> loading against 192.168.21.203 (host unreachable from this machine on 2026-09-23)", "the live loading-phase packet burst through the platform/pending stand-ins", "auth/login failure popups (wrong password, already logged in, blocked)", "CG_CLIENT_VERSION with an empty filename (GetExcutedFileName stub) accepted by the server"], "tests": ["port.login_flow: pass", "port.login_live: skipped without MT_LIVE_*", "script/port_gate.sh macos: PASS"], "todo": ["run port.login_live once the server is reachable", "port the platform/pending units"]} {"time": "2026-09-23T07:40:54Z", "event": "port_round", "unit": "PORT-PLAN 2V1-e: live smoke against 192.168.21.203", "ported": [], "adapted": [], "divergent": [], "needs_live": ["the loading-phase packet burst after GC_MAIN_CHARACTER and CG_ENTERGAME (2V2 GameWindow)", "auth/login failure popups", "server handling of CG_CLIENT_VERSION with an empty filename (not observable client-side)"], "tests": ["port.login_live: pass x2 against 192.168.21.203 (auth handshake + key agreement + LOGIN3, game LOGIN2, character list, DirectEnter reconnect, CHARACTER_SELECT, GC_MAIN_CHARACTER -> LoadData + CG_CLIENT_VERSION; no unknown packets)", "port.login_flow: pass"], "todo": ["2V2", "port the platform/pending units"]} {"time": "2026-09-23T07:52:21Z", "event": "port_round", "unit": "PORT-PLAN 2V2-a: game.GameWindow opens after Loading, CG_ENTERGAME", "ported": [], "adapted": ["2V0 stub modules: 40250 constants (verbatim init lines, stub_constants.py) and zero return values shaped like each reference function's last Py_BuildValue"], "divergent": [], "fixed": ["UserInterface/StdAfx.h included GameType.h before Locale.h, dropping GameType.h's ENABLE_NEW_EQUIPMENT_SYSTEM branches; 40250 PCH order restored"], "needs_live": ["PHASE_GAME and the Entergame burst: GamePhase/SetGamePhase still stand-ins (2V2-b)"], "tests": ["port.login_flow: pass (fake server receives CG_ENTERGAME with the right sequence byte, GameWindow shown)", "port.login_live: pass against 192.168.21.203 (GameWindow shown)", "port.packet: pass"], "todo": ["2V2-b PhaseGame dispatch", "2V2-c PythonCharacterManager", "2V2-d InstanceBase/ActorInstance", "2V2-e render"]} +{"time": "2026-09-23T09:19:19Z", "event": "port_round", "unit": "PORT-PLAN 2V2-b: PhaseGame dispatch + Entergame burst", "ported": ["UserInterface/PythonNetworkStreamPhaseGame.cpp", "UserInterface/PythonNetworkStreamPhaseGameActor.cpp", "UserInterface/PythonNetworkStreamPhaseGameItem.cpp", "UserInterface/PythonNetworkStreamCommand.cpp", "UserInterface/NetworkActorManager.cpp", "UserInterface/PythonChat.cpp", "UserInterface/PythonChatModule.cpp"], "adapted": ["GameSingletons in PythonBoot (CPythonApplication member order, calloc storage) for units still behind platform/pending stand-ins", "platform_stub.py pending: stand-ins generated from undefined symbols", "PlatformStub const char* stand-ins return \"\"", "EterBase TraceErrorObserver test hook"], "divergent": [], "needs_live": ["CreateInstance of every actor fails on the SetRace placeholder (2V2-d)"], "tests": ["port.login_flow: pass (fake server sends the CInputLogin::Entergame order: ADD/ADDITIONAL_INFO/UPDATE, NPC_POSITION, PHASE_GAME, LAND_LIST, TIME, CHANNEL, CHAT notice, PING -> PONG; notice reaches CPythonChat; no Unknown packet header)", "port.login_live: pass against 192.168.21.203 (10 s of the real game phase, connected, no unknown packet)", "script/port_gate.sh macos: PASS"], "todo": ["2V2-c chrmgr/chr modules", "2V2-d SetRace/RaceData", "2V2-e render"]} diff --git a/audit/port-map/GameLib/ActorInstance.cpp.json b/audit/port-map/GameLib/ActorInstance.cpp.json new file mode 100644 index 00000000..58307493 --- /dev/null +++ b/audit/port-map/GameLib/ActorInstance.cpp.json @@ -0,0 +1,251 @@ +{ + "reference": "GameLib/ActorInstance.cpp", + "reference_sha256": "29fa76807f3fbd3c066a3e9464540852a3f5879b4a4d3acc4287dbfa1a6356c3", + "priority": "P0", + "contracts": [], + "functions": { + "CActorInstance::INSTANCEBASE_Deform": { + "status": "TODO" + }, + "CActorInstance::INSTANCEBASE_Transform": { + "status": "TODO" + }, + "CActorInstance::OnUpdate": { + "status": "TODO" + }, + "CActorInstance::GetBackground": { + "status": "TODO" + }, + "CActorInstance::SetMainInstance": { + "status": "TODO" + }, + "CActorInstance::SetParalysis": { + "status": "TODO" + }, + "CActorInstance::SetFaint": { + "status": "TODO" + }, + "CActorInstance::SetSleep": { + "status": "TODO" + }, + "CActorInstance::SetResistFallen": { + "status": "TODO" + }, + "CActorInstance::SetReachScale": { + "status": "TODO" + }, + "CActorInstance::__GetReachScale": { + "status": "TODO" + }, + "CActorInstance::__GetAttackSpeed": { + "status": "TODO" + }, + "CActorInstance::__GetCurrentComboType": { + "status": "TODO" + }, + "CActorInstance::SetComboType": { + "status": "TODO" + }, + "CActorInstance::SetAttackSpeed": { + "status": "TODO" + }, + "CActorInstance::SetMoveSpeed": { + "status": "TODO" + }, + "CActorInstance::SetFishingPosition": { + "status": "TODO" + }, + "CActorInstance::Move": { + "status": "TODO" + }, + "CActorInstance::Stop": { + "status": "TODO" + }, + "CActorInstance::SetOwner": { + "status": "TODO" + }, + "CActorInstance::SetActorType": { + "status": "TODO" + }, + "CActorInstance::GetActorType": { + "status": "TODO" + }, + "CActorInstance::IsHandMode": { + "status": "TODO" + }, + "CActorInstance::IsTwoHandMode": { + "status": "TODO" + }, + "CActorInstance::IsBowMode": { + "status": "TODO" + }, + "CActorInstance::IsPoly": { + "status": "TODO" + }, + "CActorInstance::IsPC": { + "status": "TODO" + }, + "CActorInstance::IsNPC": { + "status": "TODO" + }, + "CActorInstance::IsEnemy": { + "status": "TODO" + }, + "CActorInstance::IsStone": { + "status": "TODO" + }, + "CActorInstance::IsWarp": { + "status": "TODO" + }, + "CActorInstance::IsGoto": { + "status": "TODO" + }, + "CActorInstance::IsBuilding": { + "status": "TODO" + }, + "CActorInstance::IsDoor": { + "status": "TODO" + }, + "CActorInstance::IsObject": { + "status": "TODO" + }, + "CActorInstance::DestroySystem": { + "status": "TODO" + }, + "CActorInstance::DieEnd": { + "status": "TODO" + }, + "CActorInstance::Die": { + "status": "TODO" + }, + "CActorInstance::IsSleep": { + "status": "TODO" + }, + "CActorInstance::IsParalysis": { + "status": "TODO" + }, + "CActorInstance::IsFaint": { + "status": "TODO" + }, + "CActorInstance::IsResistFallen": { + "status": "TODO" + }, + "CActorInstance::IsMoving": { + "status": "TODO" + }, + "CActorInstance::IsWaiting": { + "status": "TODO" + }, + "CActorInstance::IsDead": { + "status": "TODO" + }, + "CActorInstance::IsKnockDown": { + "status": "TODO" + }, + "CActorInstance::IsDamage": { + "status": "TODO" + }, + "CActorInstance::IsAttacked": { + "status": "TODO" + }, + "CActorInstance::PhysicsProcess": { + "status": "TODO" + }, + "CActorInstance::__AccumulationMovement": { + "status": "TODO" + }, + "CActorInstance::AccumulationMovement": { + "status": "TODO" + }, + "CActorInstance::TransformProcess": { + "status": "TODO" + }, + "CActorInstance::OnUpdateCollisionData": { + "status": "TODO" + }, + "CActorInstance::OnUpdateHeighInstance": { + "status": "TODO" + }, + "CActorInstance::OnGetObjectHeight": { + "status": "TODO" + }, + "CActorInstance::Revive": { + "status": "TODO" + }, + "CActorInstance::IsStun": { + "status": "TODO" + }, + "CActorInstance::Stun": { + "status": "TODO" + }, + "CActorInstance::SetWalkMode": { + "status": "TODO" + }, + "CActorInstance::SetRunMode": { + "status": "TODO" + }, + "CActorInstance::GetNormalAttackIndex": { + "status": "TODO" + }, + "CActorInstance::__InitializeMovement": { + "status": "TODO" + }, + "CActorInstance::AddMovement": { + "status": "TODO" + }, + "CActorInstance::AdjustDynamicCollisionMovement": { + "status": "TODO" + }, + "CActorInstance::__AdjustCollisionMovement": { + "status": "TODO" + }, + "CActorInstance::IsMovement": { + "status": "TODO" + }, + "CActorInstance::GetHeight": { + "status": "TODO" + }, + "CActorInstance::IntersectDefendingSphere": { + "status": "TODO" + }, + "CActorInstance::__IsMountingHorse": { + "status": "TODO" + }, + "CActorInstance::MountHorse": { + "status": "TODO" + }, + "CActorInstance::__CreateTree": { + "status": "TODO" + }, + "CActorInstance::__DestroyTree": { + "status": "TODO" + }, + "CActorInstance::__SetTreePosition": { + "status": "TODO" + }, + "CActorInstance::ClearAttachingEffect": { + "status": "TODO" + }, + "CActorInstance::Destroy": { + "status": "TODO" + }, + "CActorInstance::__InitializeRotationData": { + "status": "TODO" + }, + "CActorInstance::__InitializeStateData": { + "status": "TODO" + }, + "CActorInstance::__InitializeMotionData": { + "status": "TODO" + }, + "CActorInstance::__Initialize": { + "status": "TODO" + }, + "CActorInstance::CActorInstance": { + "status": "TODO" + }, + "CActorInstance::~CActorInstance": { + "status": "TODO" + } + } +} diff --git a/audit/port-map/GameLib/ActorInstanceData.cpp.json b/audit/port-map/GameLib/ActorInstanceData.cpp.json new file mode 100644 index 00000000..10409da5 --- /dev/null +++ b/audit/port-map/GameLib/ActorInstanceData.cpp.json @@ -0,0 +1,44 @@ +{ + "reference": "GameLib/ActorInstanceData.cpp", + "reference_sha256": "c8f4c28eeeac19e4d827d1c742477e46d2780acff230af49b74c668aac14a701", + "priority": "P1", + "contracts": [], + "functions": { + "CActorInstance::GetVirtualID": { + "status": "TODO" + }, + "CActorInstance::SetVirtualID": { + "status": "TODO" + }, + "CActorInstance::UpdateAttribute": { + "status": "TODO" + }, + "CActorInstance::__CreateAttributeInstance": { + "status": "TODO" + }, + "CActorInstance::GetRace": { + "status": "TODO" + }, + "CActorInstance::SetRace": { + "status": "TODO" + }, + "CActorInstance::SetHair": { + "status": "TODO" + }, + "CActorInstance::SetShape": { + "status": "TODO" + }, + "CActorInstance::ChangeMaterial": { + "status": "TODO" + }, + "CActorInstance::GetPartItemID": { + "status": "TODO" + }, + "CActorInstance::SetSpecularInfo": { + "status": "TODO" + }, + "CActorInstance::SetSpecularInfoForce": { + "status": "TODO" + } + } +} diff --git a/audit/port-map/GameLib/RaceData.cpp.json b/audit/port-map/GameLib/RaceData.cpp.json new file mode 100644 index 00000000..858885bc --- /dev/null +++ b/audit/port-map/GameLib/RaceData.cpp.json @@ -0,0 +1,152 @@ +{ + "reference": "GameLib/RaceData.cpp", + "reference_sha256": "399a7690468dac633f649561e577a20bf6ce48979734e20dcb92b10c1f9f47ec", + "priority": "P1", + "contracts": [], + "functions": { + "CRaceData::GetSmokeBone": { + "status": "TODO" + }, + "CRaceData::GetSmokeEffectID": { + "status": "TODO" + }, + "CRaceData::FindHair": { + "status": "TODO" + }, + "CRaceData::SetHairSkin": { + "status": "TODO" + }, + "CRaceData::FindShape": { + "status": "TODO" + }, + "CRaceData::SetShapeModel": { + "status": "TODO" + }, + "CRaceData::AppendShapeSkin": { + "status": "TODO" + }, + "CRaceData::New": { + "status": "TODO" + }, + "CRaceData::Delete": { + "status": "TODO" + }, + "CRaceData::CreateSystem": { + "status": "TODO" + }, + "CRaceData::DestroySystem": { + "status": "TODO" + }, + "CRaceData::CreateMotionModeIterator": { + "status": "TODO" + }, + "CRaceData::NextMotionModeIterator": { + "status": "TODO" + }, + "CRaceData::GetMotionKey": { + "status": "TODO" + }, + "CRaceData::GetMotionModeDataPointer": { + "status": "TODO" + }, + "CRaceData::GetModelDataPointer": { + "status": "TODO" + }, + "CRaceData::GetMotionVectorPointer": { + "status": "TODO" + }, + "CRaceData::GetMotionDataPointer": { + "status": "TODO" + }, + "CRaceData::GetAttachingDataCount": { + "status": "TODO" + }, + "CRaceData::GetAttachingDataPointer": { + "status": "TODO" + }, + "CRaceData::GetCollisionDataPointer": { + "status": "TODO" + }, + "CRaceData::GetBodyCollisionDataPointer": { + "status": "TODO" + }, + "CRaceData::SetRace": { + "status": "TODO" + }, + "CRaceData::RegisterAttachingBoneName": { + "status": "TODO" + }, + "CRaceData::RegisterMotionMode": { + "status": "TODO" + }, + "CRaceData::NEW_RegisterMotion": { + "status": "TODO" + }, + "CRaceData::RegisterMotionData": { + "status": "TODO" + }, + "CRaceData::OLD_RegisterMotion": { + "status": "TODO" + }, + "CRaceData::__OLD_RegisterMotion": { + "status": "TODO" + }, + "CRaceData::SetMotionRandomWeight": { + "status": "TODO" + }, + "CRaceData::RegisterNormalAttack": { + "status": "TODO" + }, + "CRaceData::GetNormalAttackIndex": { + "status": "TODO" + }, + "CRaceData::ReserveComboAttack": { + "status": "TODO" + }, + "CRaceData::RegisterComboAttack": { + "status": "TODO" + }, + "CRaceData::GetComboDataPointer": { + "status": "TODO" + }, + "CRaceData::GetBaseModelFileName": { + "status": "TODO" + }, + "CRaceData::GetAttributeFileName": { + "status": "TODO" + }, + "CRaceData::GetMotionListFileName": { + "status": "TODO" + }, + "CRaceData::GetBaseModelThing": { + "status": "TODO" + }, + "CRaceData::GetLODModelThing": { + "status": "TODO" + }, + "CRaceData::GetAttributeDataPtr": { + "status": "TODO" + }, + "CRaceData::GetAttachingBoneName": { + "status": "TODO" + }, + "CRaceData::IsTree": { + "status": "TODO" + }, + "CRaceData::GetTreeFileName": { + "status": "TODO" + }, + "CRaceData::Destroy": { + "status": "TODO" + }, + "CRaceData::__Initialize": { + "status": "TODO" + }, + "CRaceData::CRaceData": { + "status": "TODO" + }, + "CRaceData::~CRaceData": { + "status": "TODO" + } + } +} diff --git a/audit/port-map/GameLib/RaceManager.cpp.json b/audit/port-map/GameLib/RaceManager.cpp.json new file mode 100644 index 00000000..b66cd4cb --- /dev/null +++ b/audit/port-map/GameLib/RaceManager.cpp.json @@ -0,0 +1,65 @@ +{ + "reference": "GameLib/RaceManager.cpp", + "reference_sha256": "52f446872e4619da00b4e1a1790c181aad0a5ef0dc48e7016d3fab3d53a81f2c", + "priority": "P4", + "contracts": [], + "functions": { + "__IsGuildRace": { + "status": "TODO" + }, + "__IsNPCRace": { + "status": "TODO" + }, + "__GetRaceResourcePathes": { + "status": "TODO" + }, + "CRaceManager::__LoadRaceData": { + "status": "TODO" + }, + "CRaceManager::__LoadRaceMotionList": { + "status": "TODO" + }, + "CRaceManager::RegisterRaceSrcName": { + "status": "TODO" + }, + "CRaceManager::RegisterRaceName": { + "status": "TODO" + }, + "CRaceManager::CreateRace": { + "status": "TODO" + }, + "CRaceManager::SelectRace": { + "status": "TODO" + }, + "CRaceManager::GetSelectedRaceDataPointer": { + "status": "TODO" + }, + "CRaceManager::GetRaceDataPointer": { + "status": "TODO" + }, + "CRaceManager::SetPathName": { + "status": "TODO" + }, + "CRaceManager::GetFullPathFileName": { + "status": "TODO" + }, + "CRaceManager::Create": { + "status": "TODO" + }, + "CRaceManager::__Initialize": { + "status": "TODO" + }, + "CRaceManager::__DestroyRaceDataMap": { + "status": "TODO" + }, + "CRaceManager::Destroy": { + "status": "TODO" + }, + "CRaceManager::CRaceManager": { + "status": "TODO" + }, + "CRaceManager::~CRaceManager": { + "status": "TODO" + } + } +} diff --git a/audit/port-map/UserInterface/InstanceBase.cpp.json b/audit/port-map/UserInterface/InstanceBase.cpp.json new file mode 100644 index 00000000..6d88dbbb --- /dev/null +++ b/audit/port-map/UserInterface/InstanceBase.cpp.json @@ -0,0 +1,614 @@ +{ + "reference": "UserInterface/InstanceBase.cpp", + "reference_sha256": "73af0fdd22f5fbe97605dbfbde5963cf4f87b84e08d93ec092b4de6f28cd3225", + "priority": "P0", + "contracts": [], + "functions": { + "IsWall": { + "status": "TODO" + }, + "CInstanceBase::SHORSE::SHORSE": { + "status": "TODO" + }, + "CInstanceBase::SHORSE::~SHORSE": { + "status": "TODO" + }, + "CInstanceBase::SHORSE::__Initialize": { + "status": "TODO" + }, + "CInstanceBase::SHORSE::SetAttackSpeed": { + "status": "TODO" + }, + "CInstanceBase::SHORSE::SetMoveSpeed": { + "status": "TODO" + }, + "CInstanceBase::SHORSE::Create": { + "status": "TODO" + }, + "CInstanceBase::SHORSE::Destroy": { + "status": "TODO" + }, + "CInstanceBase::SHORSE::GetActorRef": { + "status": "TODO" + }, + "CInstanceBase::SHORSE::GetActorPtr": { + "status": "TODO" + }, + "CInstanceBase::SHORSE::GetLevel": { + "status": "TODO" + }, + "CInstanceBase::SHORSE::IsNewMount": { + "status": "TODO" + }, + "CInstanceBase::SHORSE::CanUseSkill": { + "status": "TODO" + }, + "CInstanceBase::SHORSE::CanAttack": { + "status": "TODO" + }, + "CInstanceBase::SHORSE::IsMounting": { + "status": "TODO" + }, + "CInstanceBase::SHORSE::Deform": { + "status": "TODO" + }, + "CInstanceBase::SHORSE::Render": { + "status": "TODO" + }, + "CInstanceBase::__AttachHorseSaddle": { + "status": "TODO" + }, + "CInstanceBase::__DetachHorseSaddle": { + "status": "TODO" + }, + "CInstanceBase::BlockMovement": { + "status": "TODO" + }, + "CInstanceBase::IsBlockObject": { + "status": "TODO" + }, + "CInstanceBase::AvoidObject": { + "status": "TODO" + }, + "__ArmorVnumToShape": { + "status": "TODO" + }, + "CInstanceBase::LessRenderOrder": { + "status": "TODO" + }, + "CInstanceBase::__LessRenderOrder_GetLODLevel": { + "status": "TODO" + }, + "CInstanceBase::__Background_GetWaterHeight": { + "status": "TODO" + }, + "CInstanceBase::__Background_IsWaterPixelPosition": { + "status": "TODO" + }, + "CInstanceBase::__IsInDustRange": { + "status": "TODO" + }, + "CInstanceBase::__EnableSkipCollision": { + "status": "TODO" + }, + "CInstanceBase::__DisableSkipCollision": { + "status": "TODO" + }, + "CInstanceBase::__GetShadowMapColor": { + "status": "TODO" + }, + "CInstanceBase::__GetBackgroundHeight": { + "status": "TODO" + }, + "CInstanceBase::IsMovieMode": { + "status": "TODO" + }, + "CInstanceBase::IsInvisibility": { + "status": "TODO" + }, + "CInstanceBase::IsParalysis": { + "status": "TODO" + }, + "CInstanceBase::IsGameMaster": { + "status": "TODO" + }, + "CInstanceBase::IsSameEmpire": { + "status": "TODO" + }, + "CInstanceBase::GetEmpireID": { + "status": "TODO" + }, + "CInstanceBase::GetGuildID": { + "status": "TODO" + }, + "CInstanceBase::GetAlignment": { + "status": "TODO" + }, + "CInstanceBase::GetAlignmentGrade": { + "status": "TODO" + }, + "CInstanceBase::GetAlignmentType": { + "status": "TODO" + }, + "CInstanceBase::GetPKMode": { + "status": "TODO" + }, + "CInstanceBase::IsKiller": { + "status": "TODO" + }, + "CInstanceBase::IsPartyMember": { + "status": "TODO" + }, + "CInstanceBase::IsInSafe": { + "status": "TODO" + }, + "CInstanceBase::CalculateDistanceSq3d": { + "status": "TODO" + }, + "CInstanceBase::OnSelected": { + "status": "TODO" + }, + "CInstanceBase::OnUnselected": { + "status": "TODO" + }, + "CInstanceBase::OnTargeted": { + "status": "TODO" + }, + "CInstanceBase::OnUntargeted": { + "status": "TODO" + }, + "CInstanceBase::DestroySystem": { + "status": "TODO" + }, + "CInstanceBase::CreateSystem": { + "status": "TODO" + }, + "CInstanceBase::New": { + "status": "TODO" + }, + "CInstanceBase::Delete": { + "status": "TODO" + }, + "CInstanceBase::SetMainInstance": { + "status": "TODO" + }, + "CInstanceBase::__GetMainInstancePtr": { + "status": "TODO" + }, + "CInstanceBase::__ClearMainInstance": { + "status": "TODO" + }, + "CInstanceBase::__IsMainInstance": { + "status": "TODO" + }, + "CInstanceBase::__IsExistMainInstance": { + "status": "TODO" + }, + "CInstanceBase::__MainCanSeeHiddenThing": { + "status": "TODO" + }, + "CInstanceBase::__GetBowRange": { + "status": "TODO" + }, + "CInstanceBase::__FindInstancePtr": { + "status": "TODO" + }, + "CInstanceBase::__FindRaceType": { + "status": "TODO" + }, + "CInstanceBase::Create": { + "status": "TODO" + }, + "CInstanceBase::__Create_SetName": { + "status": "TODO" + }, + "CInstanceBase::__Create_SetWarpName": { + "status": "TODO" + }, + "CInstanceBase::SetNameString": { + "status": "TODO" + }, + "CInstanceBase::SetRace": { + "status": "TODO" + }, + "CInstanceBase::__IsChangableWeapon": { + "status": "TODO" + }, + "CInstanceBase::IsWearingDress": { + "status": "TODO" + }, + "CInstanceBase::IsHoldingPickAxe": { + "status": "TODO" + }, + "CInstanceBase::IsNewMount": { + "status": "TODO" + }, + "CInstanceBase::IsMountingHorse": { + "status": "TODO" + }, + "CInstanceBase::MountHorse": { + "status": "TODO" + }, + "CInstanceBase::DismountHorse": { + "status": "TODO" + }, + "CInstanceBase::GetInfo": { + "status": "TODO" + }, + "CInstanceBase::ResetPerformanceCounter": { + "status": "TODO" + }, + "CInstanceBase::NEW_IsLastPixelPosition": { + "status": "TODO" + }, + "CInstanceBase::NEW_GetLastPixelPositionRef": { + "status": "TODO" + }, + "CInstanceBase::NEW_SetDstPixelPositionZ": { + "status": "TODO" + }, + "CInstanceBase::NEW_SetDstPixelPosition": { + "status": "TODO" + }, + "CInstanceBase::NEW_SetSrcPixelPosition": { + "status": "TODO" + }, + "CInstanceBase::NEW_GetCurPixelPositionRef": { + "status": "TODO" + }, + "CInstanceBase::NEW_GetDstPixelPositionRef": { + "status": "TODO" + }, + "CInstanceBase::NEW_GetSrcPixelPositionRef": { + "status": "TODO" + }, + "CInstanceBase::OnSyncing": { + "status": "TODO" + }, + "CInstanceBase::OnWaiting": { + "status": "TODO" + }, + "CInstanceBase::OnMoving": { + "status": "TODO" + }, + "CInstanceBase::ChangeGuild": { + "status": "TODO" + }, + "CInstanceBase::GetPart": { + "status": "TODO" + }, + "CInstanceBase::GetShape": { + "status": "TODO" + }, + "CInstanceBase::CanAct": { + "status": "TODO" + }, + "CInstanceBase::CanMove": { + "status": "TODO" + }, + "CInstanceBase::CanUseSkill": { + "status": "TODO" + }, + "CInstanceBase::CanAttack": { + "status": "TODO" + }, + "CInstanceBase::CanFishing": { + "status": "TODO" + }, + "CInstanceBase::IsBowMode": { + "status": "TODO" + }, + "CInstanceBase::IsHandMode": { + "status": "TODO" + }, + "CInstanceBase::IsFishingMode": { + "status": "TODO" + }, + "CInstanceBase::IsFishing": { + "status": "TODO" + }, + "CInstanceBase::IsDead": { + "status": "TODO" + }, + "CInstanceBase::IsStun": { + "status": "TODO" + }, + "CInstanceBase::IsSleep": { + "status": "TODO" + }, + "CInstanceBase::__IsSyncing": { + "status": "TODO" + }, + "CInstanceBase::NEW_SetOwner": { + "status": "TODO" + }, + "CInstanceBase::GetLocalTime": { + "status": "TODO" + }, + "CInstanceBase::PushUDPState": { + "status": "TODO" + }, + "CInstanceBase::PushTCPStateExpanded": { + "status": "TODO" + }, + "CInstanceBase::PushTCPState": { + "status": "TODO" + }, + "CInstanceBase::__CanProcessNetworkStatePacket": { + "status": "TODO" + }, + "CInstanceBase::__IsEnableTCPProcess": { + "status": "TODO" + }, + "CInstanceBase::StateProcess": { + "status": "TODO" + }, + "CInstanceBase::MovementProcess": { + "status": "TODO" + }, + "CInstanceBase::__ProcessFunctionEmotion": { + "status": "TODO" + }, + "CInstanceBase::Update": { + "status": "TODO" + }, + "CInstanceBase::Transform": { + "status": "TODO" + }, + "CInstanceBase::Deform": { + "status": "TODO" + }, + "CInstanceBase::RenderTrace": { + "status": "TODO" + }, + "CInstanceBase::Render": { + "status": "TODO" + }, + "CInstanceBase::RenderToShadowMap": { + "status": "TODO" + }, + "CInstanceBase::RenderCollision": { + "status": "TODO" + }, + "CInstanceBase::SetVirtualID": { + "status": "TODO" + }, + "CInstanceBase::SetVirtualNumber": { + "status": "TODO" + }, + "CInstanceBase::SetInstanceType": { + "status": "TODO" + }, + "CInstanceBase::SetAlignment": { + "status": "TODO" + }, + "CInstanceBase::SetPKMode": { + "status": "TODO" + }, + "CInstanceBase::SetKiller": { + "status": "TODO" + }, + "CInstanceBase::SetPartyMemberFlag": { + "status": "TODO" + }, + "CInstanceBase::SetStateFlags": { + "status": "TODO" + }, + "CInstanceBase::SetComboType": { + "status": "TODO" + }, + "CInstanceBase::GetNameString": { + "status": "TODO" + }, + "CInstanceBase::GetRace": { + "status": "TODO" + }, + "CInstanceBase::IsConflictAlignmentInstance": { + "status": "TODO" + }, + "CInstanceBase::SetDuelMode": { + "status": "TODO" + }, + "CInstanceBase::GetDuelMode": { + "status": "TODO" + }, + "CInstanceBase::IsAttackableInstance": { + "status": "TODO" + }, + "CInstanceBase::IsTargetableInstance": { + "status": "TODO" + }, + "CInstanceBase::CanChangeTarget": { + "status": "TODO" + }, + "CInstanceBase::CanPickInstance": { + "status": "TODO" + }, + "CInstanceBase::CanViewTargetHP": { + "status": "TODO" + }, + "CInstanceBase::IsPoly": { + "status": "TODO" + }, + "CInstanceBase::IsPC": { + "status": "TODO" + }, + "CInstanceBase::IsNPC": { + "status": "TODO" + }, + "CInstanceBase::IsEnemy": { + "status": "TODO" + }, + "CInstanceBase::IsStone": { + "status": "TODO" + }, + "CInstanceBase::IsGuildWall": { + "status": "TODO" + }, + "CInstanceBase::IsResource": { + "status": "TODO" + }, + "CInstanceBase::IsWarp": { + "status": "TODO" + }, + "CInstanceBase::IsGoto": { + "status": "TODO" + }, + "CInstanceBase::IsObject": { + "status": "TODO" + }, + "CInstanceBase::IsBuilding": { + "status": "TODO" + }, + "CInstanceBase::IsDoor": { + "status": "TODO" + }, + "CInstanceBase::IsWoodenDoor": { + "status": "TODO" + }, + "CInstanceBase::IsStoneDoor": { + "status": "TODO" + }, + "CInstanceBase::IsFlag": { + "status": "TODO" + }, + "CInstanceBase::IsForceVisible": { + "status": "TODO" + }, + "CInstanceBase::GetInstanceType": { + "status": "TODO" + }, + "CInstanceBase::GetVirtualID": { + "status": "TODO" + }, + "CInstanceBase::GetVirtualNumber": { + "status": "TODO" + }, + "CInstanceBase::__IsInViewFrustum": { + "status": "TODO" + }, + "CInstanceBase::__CanRender": { + "status": "TODO" + }, + "CInstanceBase::IntersectBoundingBox": { + "status": "TODO" + }, + "CInstanceBase::IntersectDefendingSphere": { + "status": "TODO" + }, + "CInstanceBase::GetDistance": { + "status": "TODO" + }, + "CInstanceBase::GetGraphicThingInstanceRef": { + "status": "TODO" + }, + "CInstanceBase::GetGraphicThingInstancePtr": { + "status": "TODO" + }, + "CInstanceBase::RefreshActorInstance": { + "status": "TODO" + }, + "CInstanceBase::Refresh": { + "status": "TODO" + }, + "CInstanceBase::RestoreRenderMode": { + "status": "TODO" + }, + "CInstanceBase::SetAddRenderMode": { + "status": "TODO" + }, + "CInstanceBase::SetModulateRenderMode": { + "status": "TODO" + }, + "CInstanceBase::SetRenderMode": { + "status": "TODO" + }, + "CInstanceBase::SetAddColor": { + "status": "TODO" + }, + "CInstanceBase::__SetBlendRenderingMode": { + "status": "TODO" + }, + "CInstanceBase::__SetAlphaValue": { + "status": "TODO" + }, + "CInstanceBase::__GetAlphaValue": { + "status": "TODO" + }, + "CInstanceBase::SetHair": { + "status": "TODO" + }, + "CInstanceBase::ChangeHair": { + "status": "TODO" + }, + "CInstanceBase::SetArmor": { + "status": "TODO" + }, + "CInstanceBase::SetShape": { + "status": "TODO" + }, + "CInstanceBase::GetWeaponType": { + "status": "TODO" + }, + "CInstanceBase::__ClearWeaponRefineEffect": { + "status": "TODO" + }, + "CInstanceBase::__ClearArmorRefineEffect": { + "status": "TODO" + }, + "CInstanceBase::__GetRefinedEffect": { + "status": "TODO" + }, + "CInstanceBase::SetWeapon": { + "status": "TODO" + }, + "CInstanceBase::ChangeWeapon": { + "status": "TODO" + }, + "CInstanceBase::ChangeArmor": { + "status": "TODO" + }, + "CInstanceBase::__IsShapeAnimalWear": { + "status": "TODO" + }, + "CInstanceBase::__GetRaceType": { + "status": "TODO" + }, + "CInstanceBase::RefreshState": { + "status": "TODO" + }, + "CInstanceBase::RegisterBoundingSphere": { + "status": "TODO" + }, + "CInstanceBase::CreateDeviceObjects": { + "status": "TODO" + }, + "CInstanceBase::DestroyDeviceObjects": { + "status": "TODO" + }, + "CInstanceBase::Destroy": { + "status": "TODO" + }, + "CInstanceBase::__InitializeRotationSpeed": { + "status": "TODO" + }, + "CInstanceBase::__Warrior_Initialize": { + "status": "TODO" + }, + "CInstanceBase::__Initialize": { + "status": "TODO" + }, + "CInstanceBase::CInstanceBase": { + "status": "TODO" + }, + "CInstanceBase::~CInstanceBase": { + "status": "TODO" + }, + "CInstanceBase::GetBoundBox": { + "status": "TODO" + }, + "CInstanceBase::SetLevel": { + "status": "TODO" + } + } +} diff --git a/audit/port-map/UserInterface/InstanceBaseMovement.cpp.json b/audit/port-map/UserInterface/InstanceBaseMovement.cpp.json new file mode 100644 index 00000000..dbebc745 --- /dev/null +++ b/audit/port-map/UserInterface/InstanceBaseMovement.cpp.json @@ -0,0 +1,104 @@ +{ + "reference": "UserInterface/InstanceBaseMovement.cpp", + "reference_sha256": "a03e67fda21299c75810eb108e05ff2b76d630bcbf00c4fac3d8605274d6af17", + "priority": "P0", + "contracts": [], + "functions": { + "CInstanceBase::SetAttackSpeed": { + "status": "TODO" + }, + "CInstanceBase::SetMoveSpeed": { + "status": "TODO" + }, + "CInstanceBase::SetRotationSpeed": { + "status": "TODO" + }, + "CInstanceBase::NEW_Stop": { + "status": "TODO" + }, + "CInstanceBase::NEW_SyncPixelPosition": { + "status": "TODO" + }, + "CInstanceBase::NEW_CanMoveToDestPixelPosition": { + "status": "TODO" + }, + "CInstanceBase_GetDegreeFromPosition": { + "status": "TODO" + }, + "CInstanceBase::NEW_GetAdvancingRotationFromDirPixelPosition": { + "status": "TODO" + }, + "CInstanceBase::NEW_GetAdvancingRotationFromDestPixelPosition": { + "status": "TODO" + }, + "CInstanceBase::NEW_GetAdvancingRotationFromPixelPosition": { + "status": "TODO" + }, + "CInstanceBase::NEW_SetAdvancingRotationFromDirPixelPosition": { + "status": "TODO" + }, + "CInstanceBase::NEW_SetAdvancingRotationFromPixelPosition": { + "status": "TODO" + }, + "CInstanceBase::NEW_SetAdvancingRotationFromDestPixelPosition": { + "status": "TODO" + }, + "CInstanceBase::SetAdvancingRotation": { + "status": "TODO" + }, + "CInstanceBase::StartWalking": { + "status": "TODO" + }, + "CInstanceBase::EndWalking": { + "status": "TODO" + }, + "CInstanceBase::EndWalkingWithoutBlending": { + "status": "TODO" + }, + "CInstanceBase::IsWaiting": { + "status": "TODO" + }, + "CInstanceBase::IsWalking": { + "status": "TODO" + }, + "CInstanceBase::IsPushing": { + "status": "TODO" + }, + "CInstanceBase::IsAttacked": { + "status": "TODO" + }, + "CInstanceBase::IsKnockDown": { + "status": "TODO" + }, + "CInstanceBase::IsAttacking": { + "status": "TODO" + }, + "CInstanceBase::IsActingEmotion": { + "status": "TODO" + }, + "CInstanceBase::IsGoing": { + "status": "TODO" + }, + "CInstanceBase::NEW_MoveToDestInstanceDirection": { + "status": "TODO" + }, + "CInstanceBase::NEW_MoveToDestPixelPositionDirection": { + "status": "TODO" + }, + "CInstanceBase::NEW_Goto": { + "status": "TODO" + }, + "CInstanceBase::NEW_MoveToDirection": { + "status": "TODO" + }, + "CInstanceBase::EndGoing": { + "status": "TODO" + }, + "CInstanceBase::SetRunMode": { + "status": "TODO" + }, + "CInstanceBase::SetWalkMode": { + "status": "TODO" + } + } +} diff --git a/audit/port-map/UserInterface/NetworkActorManager.cpp.json b/audit/port-map/UserInterface/NetworkActorManager.cpp.json new file mode 100644 index 00000000..a134ae26 --- /dev/null +++ b/audit/port-map/UserInterface/NetworkActorManager.cpp.json @@ -0,0 +1,176 @@ +{ + "reference": "UserInterface/NetworkActorManager.cpp", + "reference_sha256": "432b35aaad8b9194b7724596de37d1989af015b7d86896dfd69f3e287179e7fd", + "priority": "P4", + "contracts": [], + "functions": { + "SNetworkActorData::UpdatePosition": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/NetworkActorManager.cpp:SNetworkActorData::UpdatePosition" + ] + }, + "SNetworkActorData::SetDstPosition": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/NetworkActorManager.cpp:SNetworkActorData::SetDstPosition" + ] + }, + "SNetworkActorData::SetPosition": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/NetworkActorManager.cpp:SNetworkActorData::SetPosition" + ] + }, + "SNetworkActorData::SNetworkActorData": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/NetworkActorManager.cpp:SNetworkActorData::SNetworkActorData" + ] + }, + "SNetworkActorData::__copy__": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/NetworkActorManager.cpp:SNetworkActorData::__copy__" + ] + }, + "CNetworkActorManager::CNetworkActorManager": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/NetworkActorManager.cpp:CNetworkActorManager::CNetworkActorManager" + ] + }, + "CNetworkActorManager::~CNetworkActorManager": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/NetworkActorManager.cpp:CNetworkActorManager::~CNetworkActorManager" + ] + }, + "CNetworkActorManager::Destroy": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/NetworkActorManager.cpp:CNetworkActorManager::Destroy" + ] + }, + "CNetworkActorManager::SetMainActorVID": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/NetworkActorManager.cpp:CNetworkActorManager::SetMainActorVID" + ] + }, + "CNetworkActorManager::Update": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/NetworkActorManager.cpp:CNetworkActorManager::Update" + ] + }, + "CNetworkActorManager::__OLD_Update": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/NetworkActorManager.cpp:CNetworkActorManager::__OLD_Update" + ] + }, + "CNetworkActorManager::__FindActor": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/NetworkActorManager.cpp:CNetworkActorManager::__FindActor" + ] + }, + "CNetworkActorManager::__RemoveAllGroundItems": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/NetworkActorManager.cpp:CNetworkActorManager::__RemoveAllGroundItems" + ] + }, + "CNetworkActorManager::__RemoveAllActors": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/NetworkActorManager.cpp:CNetworkActorManager::__RemoveAllActors" + ] + }, + "CNetworkActorManager::__RemoveDynamicActors": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/NetworkActorManager.cpp:CNetworkActorManager::__RemoveDynamicActors" + ] + }, + "CNetworkActorManager::__UpdateMainActor": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/NetworkActorManager.cpp:CNetworkActorManager::__UpdateMainActor" + ] + }, + "CNetworkActorManager::__IsVisibleActor": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/NetworkActorManager.cpp:CNetworkActorManager::__IsVisibleActor" + ] + }, + "CNetworkActorManager::__IsVisiblePos": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/NetworkActorManager.cpp:CNetworkActorManager::__IsVisiblePos" + ] + }, + "CNetworkActorManager::__IsMainActorVID": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/NetworkActorManager.cpp:CNetworkActorManager::__IsMainActorVID" + ] + }, + "CNetworkActorManager::__GetCharacterManager": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/NetworkActorManager.cpp:CNetworkActorManager::__GetCharacterManager" + ] + }, + "CNetworkActorManager::__RemoveCharacterManagerActor": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/NetworkActorManager.cpp:CNetworkActorManager::__RemoveCharacterManagerActor" + ] + }, + "CNetworkActorManager::__AppendCharacterManagerActor": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/NetworkActorManager.cpp:CNetworkActorManager::__AppendCharacterManagerActor" + ] + }, + "CNetworkActorManager::AppendActor": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/NetworkActorManager.cpp:CNetworkActorManager::AppendActor" + ] + }, + "CNetworkActorManager::RemoveActor": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/NetworkActorManager.cpp:CNetworkActorManager::RemoveActor" + ] + }, + "CNetworkActorManager::UpdateActor": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/NetworkActorManager.cpp:CNetworkActorManager::UpdateActor" + ] + }, + "CNetworkActorManager::MoveActor": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/NetworkActorManager.cpp:CNetworkActorManager::MoveActor" + ] + }, + "CNetworkActorManager::SyncActor": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/NetworkActorManager.cpp:CNetworkActorManager::SyncActor" + ] + }, + "CNetworkActorManager::SetActorOwner": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/NetworkActorManager.cpp:CNetworkActorManager::SetActorOwner" + ] + } + } +} diff --git a/audit/port-map/UserInterface/PythonCharacterManager.cpp.json b/audit/port-map/UserInterface/PythonCharacterManager.cpp.json new file mode 100644 index 00000000..3ed393a2 --- /dev/null +++ b/audit/port-map/UserInterface/PythonCharacterManager.cpp.json @@ -0,0 +1,170 @@ +{ + "reference": "UserInterface/PythonCharacterManager.cpp", + "reference_sha256": "040f89aab5ec5f07f11ec290bdacda47c46f2fe7f584ec0e5be312060c29f9a7", + "priority": "P0", + "contracts": [], + "functions": { + "CPythonCharacterManager::AdjustCollisionWithOtherObjects": { + "status": "TODO" + }, + "CPythonCharacterManager::EnableSortRendering": { + "status": "TODO" + }, + "CPythonCharacterManager::InsertPVPKey": { + "status": "TODO" + }, + "CPythonCharacterManager::RemovePVPKey": { + "status": "TODO" + }, + "CPythonCharacterManager::ChangeGVG": { + "status": "TODO" + }, + "CPythonCharacterManager::ClearMainInstance": { + "status": "TODO" + }, + "CPythonCharacterManager::SetMainInstance": { + "status": "TODO" + }, + "CPythonCharacterManager::GetMainInstancePtr": { + "status": "TODO" + }, + "CPythonCharacterManager::GetInfo": { + "status": "TODO" + }, + "CPythonCharacterManager::IsCacheMode": { + "status": "TODO" + }, + "CPythonCharacterManager::Update": { + "status": "TODO" + }, + "CPythonCharacterManager::ShowPointEffect": { + "status": "TODO" + }, + "CPythonCharacterManager::RegisterPointEffect": { + "status": "TODO" + }, + "CPythonCharacterManager::UpdateTransform": { + "status": "TODO" + }, + "CPythonCharacterManager::UpdateDeleting": { + "status": "TODO" + }, + "CPythonCharacterManager::Deform": { + "status": "TODO" + }, + "CPythonCharacterManager::OLD_GetPickedInstanceVID": { + "status": "TODO" + }, + "CPythonCharacterManager::OLD_GetPickedInstancePtr": { + "status": "TODO" + }, + "CPythonCharacterManager::OLD_GetPickedInstPosReference": { + "status": "TODO" + }, + "CPythonCharacterManager::IsRegisteredVID": { + "status": "TODO" + }, + "CPythonCharacterManager::IsAliveVID": { + "status": "TODO" + }, + "CPythonCharacterManager::IsDeadVID": { + "status": "TODO" + }, + "CPythonCharacterManager::__RenderSortedAliveActorList": { + "status": "TODO" + }, + "CPythonCharacterManager::__RenderSortedDeadActorList": { + "status": "TODO" + }, + "CPythonCharacterManager::Render": { + "status": "TODO" + }, + "CPythonCharacterManager::RenderShadowMainInstance": { + "status": "TODO" + }, + "CPythonCharacterManager::RenderShadowAllInstances": { + "status": "TODO" + }, + "CPythonCharacterManager::RenderCollision": { + "status": "TODO" + }, + "CPythonCharacterManager::CreateInstance": { + "status": "TODO" + }, + "CPythonCharacterManager::RegisterInstance": { + "status": "TODO" + }, + "CPythonCharacterManager::DeleteInstance": { + "status": "TODO" + }, + "CPythonCharacterManager::__DeleteBlendOutInstance": { + "status": "TODO" + }, + "CPythonCharacterManager::DeleteInstanceByFade": { + "status": "TODO" + }, + "CPythonCharacterManager::SelectInstance": { + "status": "TODO" + }, + "CPythonCharacterManager::GetInstancePtr": { + "status": "TODO" + }, + "CPythonCharacterManager::GetInstancePtrByName": { + "status": "TODO" + }, + "CPythonCharacterManager::GetSelectedInstancePtr": { + "status": "TODO" + }, + "CPythonCharacterManager::FindClickableInstancePtr": { + "status": "TODO" + }, + "CPythonCharacterManager::__UpdateSortPickedActorList": { + "status": "TODO" + }, + "CPythonCharacterManager::__UpdatePickedActorList": { + "status": "TODO" + }, + "CPythonCharacterManager::__SortPickedActorList": { + "status": "TODO" + }, + "CPythonCharacterManager::__NEW_Pick": { + "status": "TODO" + }, + "CPythonCharacterManager::__OLD_Pick": { + "status": "TODO" + }, + "CPythonCharacterManager::PickAll": { + "status": "TODO" + }, + "CPythonCharacterManager::GetCloseInstance": { + "status": "TODO" + }, + "CPythonCharacterManager::RefreshAllPCTextTail": { + "status": "TODO" + }, + "CPythonCharacterManager::RefreshAllGuildMark": { + "status": "TODO" + }, + "CPythonCharacterManager::DeleteAllInstances": { + "status": "TODO" + }, + "CPythonCharacterManager::DestroyAliveInstanceMap": { + "status": "TODO" + }, + "CPythonCharacterManager::DestroyDeadInstanceList": { + "status": "TODO" + }, + "CPythonCharacterManager::Destroy": { + "status": "TODO" + }, + "CPythonCharacterManager::__Initialize": { + "status": "TODO" + }, + "CPythonCharacterManager::CPythonCharacterManager": { + "status": "TODO" + }, + "CPythonCharacterManager::~CPythonCharacterManager": { + "status": "TODO" + } + } +} diff --git a/audit/port-map/UserInterface/PythonChat.cpp.json b/audit/port-map/UserInterface/PythonChat.cpp.json new file mode 100644 index 00000000..0c805517 --- /dev/null +++ b/audit/port-map/UserInterface/PythonChat.cpp.json @@ -0,0 +1,374 @@ +{ + "reference": "UserInterface/PythonChat.cpp", + "reference_sha256": "9b1d9f153604adfb5e42a8e9fa191e202feee87987e262bc8a2f8dc00bf5b7e7", + "priority": "P3", + "contracts": [], + "functions": { + "CPythonChat::SetChatColor": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonChat.cpp:CPythonChat::SetChatColor" + ] + }, + "CPythonChat::SChatLine::New": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonChat.cpp:CPythonChat::SChatLine::New" + ] + }, + "CPythonChat::SChatLine::Delete": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonChat.cpp:CPythonChat::SChatLine::Delete" + ] + }, + "CPythonChat::SChatLine::DestroySystem": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonChat.cpp:CPythonChat::SChatLine::DestroySystem" + ] + }, + "CPythonChat::SChatLine::SetColor": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonChat.cpp:CPythonChat::SChatLine::SetColor" + ] + }, + "CPythonChat::SChatLine::SetColorAll": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonChat.cpp:CPythonChat::SChatLine::SetColorAll" + ] + }, + "CPythonChat::SChatLine::GetColorRef": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonChat.cpp:CPythonChat::SChatLine::GetColorRef" + ] + }, + "CPythonChat::SChatLine::SChatLine": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonChat.cpp:CPythonChat::SChatLine::SChatLine" + ] + }, + "CPythonChat::SChatLine::~SChatLine": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonChat.cpp:CPythonChat::SChatLine::~SChatLine" + ] + }, + "CPythonChat::CreateChatSet": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonChat.cpp:CPythonChat::CreateChatSet" + ] + }, + "CPythonChat::UpdateViewMode": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonChat.cpp:CPythonChat::UpdateViewMode" + ] + }, + "CPythonChat::UpdateEditMode": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonChat.cpp:CPythonChat::UpdateEditMode" + ] + }, + "CPythonChat::UpdateLogMode": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonChat.cpp:CPythonChat::UpdateLogMode" + ] + }, + "CPythonChat::Update": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonChat.cpp:CPythonChat::Update" + ] + }, + "CPythonChat::Render": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonChat.cpp:CPythonChat::Render" + ] + }, + "CPythonChat::SetBoardState": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonChat.cpp:CPythonChat::SetBoardState" + ] + }, + "CPythonChat::SetPosition": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonChat.cpp:CPythonChat::SetPosition" + ] + }, + "CPythonChat::SetHeight": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonChat.cpp:CPythonChat::SetHeight" + ] + }, + "CPythonChat::SetStep": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonChat.cpp:CPythonChat::SetStep" + ] + }, + "CPythonChat::ToggleChatMode": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonChat.cpp:CPythonChat::ToggleChatMode" + ] + }, + "CPythonChat::EnableChatMode": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonChat.cpp:CPythonChat::EnableChatMode" + ] + }, + "CPythonChat::DisableChatMode": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonChat.cpp:CPythonChat::DisableChatMode" + ] + }, + "CPythonChat::SetEndPos": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonChat.cpp:CPythonChat::SetEndPos" + ] + }, + "CPythonChat::GetVisibleLineCount": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonChat.cpp:CPythonChat::GetVisibleLineCount" + ] + }, + "CPythonChat::GetEditableLineCount": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonChat.cpp:CPythonChat::GetEditableLineCount" + ] + }, + "CPythonChat::GetLineCount": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonChat.cpp:CPythonChat::GetLineCount" + ] + }, + "CPythonChat::GetLineStep": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonChat.cpp:CPythonChat::GetLineStep" + ] + }, + "CPythonChat::GetChatLineListPtr": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonChat.cpp:CPythonChat::GetChatLineListPtr" + ] + }, + "CPythonChat::GetChatSetPtr": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonChat.cpp:CPythonChat::GetChatSetPtr" + ] + }, + "CPythonChat::ArrangeShowingChat": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonChat.cpp:CPythonChat::ArrangeShowingChat" + ] + }, + "CPythonChat::AppendChat": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonChat.cpp:CPythonChat::AppendChat" + ] + }, + "CPythonChat::AppendChatWithDelay": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonChat.cpp:CPythonChat::AppendChatWithDelay" + ] + }, + "CPythonChat::GetChatColor": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonChat.cpp:CPythonChat::GetChatColor" + ] + }, + "CPythonChat::IgnoreCharacter": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonChat.cpp:CPythonChat::IgnoreCharacter" + ] + }, + "CPythonChat::IsIgnoreCharacter": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonChat.cpp:CPythonChat::IsIgnoreCharacter" + ] + }, + "CPythonChat::CreateWhisper": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonChat.cpp:CPythonChat::CreateWhisper" + ] + }, + "CPythonChat::AppendWhisper": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonChat.cpp:CPythonChat::AppendWhisper" + ] + }, + "CPythonChat::ClearWhisper": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonChat.cpp:CPythonChat::ClearWhisper" + ] + }, + "CPythonChat::GetWhisper": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonChat.cpp:CPythonChat::GetWhisper" + ] + }, + "CPythonChat::InitWhisper": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonChat.cpp:CPythonChat::InitWhisper" + ] + }, + "CPythonChat::__DestroyWhisperMap": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonChat.cpp:CPythonChat::__DestroyWhisperMap" + ] + }, + "CPythonChat::Close": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonChat.cpp:CPythonChat::Close" + ] + }, + "CPythonChat::Destroy": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonChat.cpp:CPythonChat::Destroy" + ] + }, + "CPythonChat::__Initialize": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonChat.cpp:CPythonChat::__Initialize" + ] + }, + "CPythonChat::CPythonChat": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonChat.cpp:CPythonChat::CPythonChat" + ] + }, + "CPythonChat::~CPythonChat": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonChat.cpp:CPythonChat::~CPythonChat" + ] + }, + "CWhisper::New": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonChat.cpp:CWhisper::New" + ] + }, + "CWhisper::Delete": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonChat.cpp:CWhisper::Delete" + ] + }, + "CWhisper::DestroySystem": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonChat.cpp:CWhisper::DestroySystem" + ] + }, + "CWhisper::SetPosition": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonChat.cpp:CWhisper::SetPosition" + ] + }, + "CWhisper::SetBoxSize": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonChat.cpp:CWhisper::SetBoxSize" + ] + }, + "CWhisper::AppendChat": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonChat.cpp:CWhisper::AppendChat" + ] + }, + "CWhisper::__ArrangeChat": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonChat.cpp:CWhisper::__ArrangeChat" + ] + }, + "CWhisper::Render": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonChat.cpp:CWhisper::Render" + ] + }, + "CWhisper::__Initialize": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonChat.cpp:CWhisper::__Initialize" + ] + }, + "CWhisper::Destroy": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonChat.cpp:CWhisper::Destroy" + ] + }, + "CWhisper::CWhisper": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonChat.cpp:CWhisper::CWhisper" + ] + }, + "CWhisper::~CWhisper": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonChat.cpp:CWhisper::~CWhisper" + ] + }, + "CWhisper::SChatLine::New": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonChat.cpp:CWhisper::SChatLine::New" + ] + }, + "CWhisper::SChatLine::Delete": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonChat.cpp:CWhisper::SChatLine::Delete" + ] + }, + "CWhisper::SChatLine::DestroySystem": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonChat.cpp:CWhisper::SChatLine::DestroySystem" + ] + } + } +} diff --git a/audit/port-map/UserInterface/PythonChatModule.cpp.json b/audit/port-map/UserInterface/PythonChatModule.cpp.json new file mode 100644 index 00000000..feb0c50e --- /dev/null +++ b/audit/port-map/UserInterface/PythonChatModule.cpp.json @@ -0,0 +1,194 @@ +{ + "reference": "UserInterface/PythonChatModule.cpp", + "reference_sha256": "e8072051ae8777a6f85afe1b322c30488e274c15d7d69c78b8779581154710db", + "priority": "P3", + "contracts": [], + "functions": { + "chatSetChatColor": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonChatModule.cpp:chatSetChatColor" + ] + }, + "chatClear": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonChatModule.cpp:chatClear" + ] + }, + "chatClose": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonChatModule.cpp:chatClose" + ] + }, + "chatCreateChatSet": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonChatModule.cpp:chatCreateChatSet" + ] + }, + "chatUpdate": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonChatModule.cpp:chatUpdate" + ] + }, + "chatRender": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonChatModule.cpp:chatRender" + ] + }, + "chatSetBoardState": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonChatModule.cpp:chatSetBoardState" + ] + }, + "chatSetPosition": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonChatModule.cpp:chatSetPosition" + ] + }, + "chatSetHeight": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonChatModule.cpp:chatSetHeight" + ] + }, + "chatSetStep": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonChatModule.cpp:chatSetStep" + ] + }, + "chatToggleChatMode": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonChatModule.cpp:chatToggleChatMode" + ] + }, + "chatEnableChatMode": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonChatModule.cpp:chatEnableChatMode" + ] + }, + "chatDisableChatMode": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonChatModule.cpp:chatDisableChatMode" + ] + }, + "chatSetEndPos": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonChatModule.cpp:chatSetEndPos" + ] + }, + "chatGetLineCount": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonChatModule.cpp:chatGetLineCount" + ] + }, + "chatGetVisibleLineCount": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonChatModule.cpp:chatGetVisibleLineCount" + ] + }, + "chatGetLineStep": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonChatModule.cpp:chatGetLineStep" + ] + }, + "chatAppendChat": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonChatModule.cpp:chatAppendChat" + ] + }, + "chatAppendChatWithDelay": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonChatModule.cpp:chatAppendChatWithDelay" + ] + }, + "chatArrangeShowingChat": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonChatModule.cpp:chatArrangeShowingChat" + ] + }, + "chatIgnoreCharacter": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonChatModule.cpp:chatIgnoreCharacter" + ] + }, + "chatIsIgnoreCharacter": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonChatModule.cpp:chatIsIgnoreCharacter" + ] + }, + "chatCreateWhisper": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonChatModule.cpp:chatCreateWhisper" + ] + }, + "chatAppendWhisper": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonChatModule.cpp:chatAppendWhisper" + ] + }, + "chatRenderWhisper": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonChatModule.cpp:chatRenderWhisper" + ] + }, + "chatSetWhisperBoxSize": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonChatModule.cpp:chatSetWhisperBoxSize" + ] + }, + "chatSetWhisperPosition": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonChatModule.cpp:chatSetWhisperPosition" + ] + }, + "chatClearWhisper": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonChatModule.cpp:chatClearWhisper" + ] + }, + "chatInitWhisper": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonChatModule.cpp:chatInitWhisper" + ] + }, + "chatGetLinkFromHyperlink": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonChatModule.cpp:chatGetLinkFromHyperlink" + ] + }, + "initChat": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonChatModule.cpp:initChat" + ] + } + } +} diff --git a/audit/port-map/UserInterface/PythonNetworkStreamCommand.cpp.json b/audit/port-map/UserInterface/PythonNetworkStreamCommand.cpp.json new file mode 100644 index 00000000..b4ae9a61 --- /dev/null +++ b/audit/port-map/UserInterface/PythonNetworkStreamCommand.cpp.json @@ -0,0 +1,44 @@ +{ + "reference": "UserInterface/PythonNetworkStreamCommand.cpp", + "reference_sha256": "08d9a36866b03ec7a04b4d34d4176d2137c88b7767f5d6b22778cd7bf7529023", + "priority": "P2", + "contracts": [], + "functions": { + "SkipSpaces": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamCommand.cpp:SkipSpaces" + ] + }, + "OneArgument": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamCommand.cpp:OneArgument" + ] + }, + "AppendMonsterList": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamCommand.cpp:AppendMonsterList" + ] + }, + "CPythonNetworkStream::ClientCommand": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamCommand.cpp:CPythonNetworkStream::ClientCommand" + ] + }, + "SplitToken": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamCommand.cpp:SplitToken" + ] + }, + "CPythonNetworkStream::ServerCommand": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamCommand.cpp:CPythonNetworkStream::ServerCommand" + ] + } + } +} diff --git a/audit/port-map/UserInterface/PythonNetworkStreamPhaseGame.cpp.json b/audit/port-map/UserInterface/PythonNetworkStreamPhaseGame.cpp.json new file mode 100644 index 00000000..94fbb35b --- /dev/null +++ b/audit/port-map/UserInterface/PythonNetworkStreamPhaseGame.cpp.json @@ -0,0 +1,932 @@ +{ + "reference": "UserInterface/PythonNetworkStreamPhaseGame.cpp", + "reference_sha256": "85eafb922a2b297bd9434ef953c097a07ecb13c8ed137795cf974882766ce00c", + "priority": "P2", + "contracts": [], + "functions": { + "CPythonNetworkStream::__RefreshAlignmentWindow": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGame.cpp:CPythonNetworkStream::__RefreshAlignmentWindow" + ] + }, + "CPythonNetworkStream::__RefreshTargetBoardByVID": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGame.cpp:CPythonNetworkStream::__RefreshTargetBoardByVID" + ] + }, + "CPythonNetworkStream::__RefreshTargetBoardByName": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGame.cpp:CPythonNetworkStream::__RefreshTargetBoardByName" + ] + }, + "CPythonNetworkStream::__RefreshTargetBoard": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGame.cpp:CPythonNetworkStream::__RefreshTargetBoard" + ] + }, + "CPythonNetworkStream::__RefreshGuildWindowGradePage": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGame.cpp:CPythonNetworkStream::__RefreshGuildWindowGradePage" + ] + }, + "CPythonNetworkStream::__RefreshGuildWindowSkillPage": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGame.cpp:CPythonNetworkStream::__RefreshGuildWindowSkillPage" + ] + }, + "CPythonNetworkStream::__RefreshGuildWindowMemberPageGradeComboBox": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGame.cpp:CPythonNetworkStream::__RefreshGuildWindowMemberPageGradeComboBox" + ] + }, + "CPythonNetworkStream::__RefreshGuildWindowMemberPage": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGame.cpp:CPythonNetworkStream::__RefreshGuildWindowMemberPage" + ] + }, + "CPythonNetworkStream::__RefreshGuildWindowBoardPage": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGame.cpp:CPythonNetworkStream::__RefreshGuildWindowBoardPage" + ] + }, + "CPythonNetworkStream::__RefreshGuildWindowInfoPage": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGame.cpp:CPythonNetworkStream::__RefreshGuildWindowInfoPage" + ] + }, + "CPythonNetworkStream::__RefreshMessengerWindow": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGame.cpp:CPythonNetworkStream::__RefreshMessengerWindow" + ] + }, + "CPythonNetworkStream::__RefreshSafeboxWindow": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGame.cpp:CPythonNetworkStream::__RefreshSafeboxWindow" + ] + }, + "CPythonNetworkStream::__RefreshMallWindow": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGame.cpp:CPythonNetworkStream::__RefreshMallWindow" + ] + }, + "CPythonNetworkStream::__RefreshSkillWindow": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGame.cpp:CPythonNetworkStream::__RefreshSkillWindow" + ] + }, + "CPythonNetworkStream::__RefreshExchangeWindow": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGame.cpp:CPythonNetworkStream::__RefreshExchangeWindow" + ] + }, + "CPythonNetworkStream::__RefreshStatus": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGame.cpp:CPythonNetworkStream::__RefreshStatus" + ] + }, + "CPythonNetworkStream::__RefreshCharacterWindow": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGame.cpp:CPythonNetworkStream::__RefreshCharacterWindow" + ] + }, + "CPythonNetworkStream::__RefreshInventoryWindow": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGame.cpp:CPythonNetworkStream::__RefreshInventoryWindow" + ] + }, + "CPythonNetworkStream::__RefreshEquipmentWindow": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGame.cpp:CPythonNetworkStream::__RefreshEquipmentWindow" + ] + }, + "CPythonNetworkStream::__SetGuildID": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGame.cpp:CPythonNetworkStream::__SetGuildID" + ] + }, + "CPythonNetworkStream::GamePhase": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGame.cpp:CPythonNetworkStream::GamePhase" + ] + }, + "CPythonNetworkStream::__InitializeGamePhase": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGame.cpp:CPythonNetworkStream::__InitializeGamePhase" + ] + }, + "CPythonNetworkStream::Warp": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGame.cpp:CPythonNetworkStream::Warp" + ] + }, + "CPythonNetworkStream::__ShowMapName": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGame.cpp:CPythonNetworkStream::__ShowMapName" + ] + }, + "CPythonNetworkStream::__LeaveGamePhase": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGame.cpp:CPythonNetworkStream::__LeaveGamePhase" + ] + }, + "CPythonNetworkStream::SetGamePhase": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGame.cpp:CPythonNetworkStream::SetGamePhase" + ] + }, + "CPythonNetworkStream::RecvObserverAddPacket": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGame.cpp:CPythonNetworkStream::RecvObserverAddPacket" + ] + }, + "CPythonNetworkStream::RecvObserverRemovePacket": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGame.cpp:CPythonNetworkStream::RecvObserverRemovePacket" + ] + }, + "CPythonNetworkStream::RecvObserverMovePacket": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGame.cpp:CPythonNetworkStream::RecvObserverMovePacket" + ] + }, + "CPythonNetworkStream::RecvWarpPacket": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGame.cpp:CPythonNetworkStream::RecvWarpPacket" + ] + }, + "CPythonNetworkStream::RecvDuelStartPacket": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGame.cpp:CPythonNetworkStream::RecvDuelStartPacket" + ] + }, + "CPythonNetworkStream::RecvPVPPacket": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGame.cpp:CPythonNetworkStream::RecvPVPPacket" + ] + }, + "CPythonNetworkStream::NotifyHack": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGame.cpp:CPythonNetworkStream::NotifyHack" + ] + }, + "CPythonNetworkStream::__SendHack": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGame.cpp:CPythonNetworkStream::__SendHack" + ] + }, + "CPythonNetworkStream::SendMessengerAddByVIDPacket": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGame.cpp:CPythonNetworkStream::SendMessengerAddByVIDPacket" + ] + }, + "CPythonNetworkStream::SendMessengerAddByNamePacket": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGame.cpp:CPythonNetworkStream::SendMessengerAddByNamePacket" + ] + }, + "CPythonNetworkStream::SendMessengerRemovePacket": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGame.cpp:CPythonNetworkStream::SendMessengerRemovePacket" + ] + }, + "CPythonNetworkStream::SendCharacterStatePacket": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGame.cpp:CPythonNetworkStream::SendCharacterStatePacket" + ] + }, + "CPythonNetworkStream::SendUseSkillPacket": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGame.cpp:CPythonNetworkStream::SendUseSkillPacket" + ] + }, + "CPythonNetworkStream::SendChatPacket": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGame.cpp:CPythonNetworkStream::SendChatPacket" + ] + }, + "CPythonNetworkStream::RegisterEmoticonString": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGame.cpp:CPythonNetworkStream::RegisterEmoticonString" + ] + }, + "CPythonNetworkStream::ParseEmoticon": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGame.cpp:CPythonNetworkStream::ParseEmoticon" + ] + }, + "CPythonNetworkStream::__ConvertEmpireText": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGame.cpp:CPythonNetworkStream::__ConvertEmpireText" + ] + }, + "CPythonNetworkStream::RecvChatPacket": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGame.cpp:CPythonNetworkStream::RecvChatPacket" + ] + }, + "CPythonNetworkStream::RecvWhisperPacket": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGame.cpp:CPythonNetworkStream::RecvWhisperPacket" + ] + }, + "CPythonNetworkStream::SendWhisperPacket": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGame.cpp:CPythonNetworkStream::SendWhisperPacket" + ] + }, + "CPythonNetworkStream::SendMobileMessagePacket": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGame.cpp:CPythonNetworkStream::SendMobileMessagePacket" + ] + }, + "CPythonNetworkStream::RecvPointChange": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGame.cpp:CPythonNetworkStream::RecvPointChange" + ] + }, + "CPythonNetworkStream::RecvStunPacket": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGame.cpp:CPythonNetworkStream::RecvStunPacket" + ] + }, + "CPythonNetworkStream::RecvDeadPacket": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGame.cpp:CPythonNetworkStream::RecvDeadPacket" + ] + }, + "CPythonNetworkStream::SendCharacterPositionPacket": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGame.cpp:CPythonNetworkStream::SendCharacterPositionPacket" + ] + }, + "CPythonNetworkStream::SendOnClickPacket": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGame.cpp:CPythonNetworkStream::SendOnClickPacket" + ] + }, + "CPythonNetworkStream::RecvCharacterPositionPacket": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGame.cpp:CPythonNetworkStream::RecvCharacterPositionPacket" + ] + }, + "CPythonNetworkStream::RecvMotionPacket": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGame.cpp:CPythonNetworkStream::RecvMotionPacket" + ] + }, + "CPythonNetworkStream::RecvShopPacket": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGame.cpp:CPythonNetworkStream::RecvShopPacket" + ] + }, + "CPythonNetworkStream::RecvExchangePacket": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGame.cpp:CPythonNetworkStream::RecvExchangePacket" + ] + }, + "CPythonNetworkStream::RecvQuestInfoPacket": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGame.cpp:CPythonNetworkStream::RecvQuestInfoPacket" + ] + }, + "CPythonNetworkStream::RecvQuestConfirmPacket": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGame.cpp:CPythonNetworkStream::RecvQuestConfirmPacket" + ] + }, + "CPythonNetworkStream::RecvRequestMakeGuild": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGame.cpp:CPythonNetworkStream::RecvRequestMakeGuild" + ] + }, + "CPythonNetworkStream::ToggleGameDebugInfo": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGame.cpp:CPythonNetworkStream::ToggleGameDebugInfo" + ] + }, + "CPythonNetworkStream::SendExchangeStartPacket": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGame.cpp:CPythonNetworkStream::SendExchangeStartPacket" + ] + }, + "CPythonNetworkStream::SendExchangeElkAddPacket": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGame.cpp:CPythonNetworkStream::SendExchangeElkAddPacket" + ] + }, + "CPythonNetworkStream::SendExchangeItemAddPacket": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGame.cpp:CPythonNetworkStream::SendExchangeItemAddPacket" + ] + }, + "CPythonNetworkStream::SendExchangeItemDelPacket": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGame.cpp:CPythonNetworkStream::SendExchangeItemDelPacket" + ] + }, + "CPythonNetworkStream::SendExchangeAcceptPacket": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGame.cpp:CPythonNetworkStream::SendExchangeAcceptPacket" + ] + }, + "CPythonNetworkStream::SendExchangeExitPacket": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGame.cpp:CPythonNetworkStream::SendExchangeExitPacket" + ] + }, + "CPythonNetworkStream::SendPointResetPacket": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGame.cpp:CPythonNetworkStream::SendPointResetPacket" + ] + }, + "CPythonNetworkStream::__IsPlayerAttacking": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGame.cpp:CPythonNetworkStream::__IsPlayerAttacking" + ] + }, + "CPythonNetworkStream::RecvScriptPacket": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGame.cpp:CPythonNetworkStream::RecvScriptPacket" + ] + }, + "CPythonNetworkStream::SendScriptAnswerPacket": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGame.cpp:CPythonNetworkStream::SendScriptAnswerPacket" + ] + }, + "CPythonNetworkStream::SendScriptButtonPacket": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGame.cpp:CPythonNetworkStream::SendScriptButtonPacket" + ] + }, + "CPythonNetworkStream::SendAnswerMakeGuildPacket": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGame.cpp:CPythonNetworkStream::SendAnswerMakeGuildPacket" + ] + }, + "CPythonNetworkStream::SendQuestInputStringPacket": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGame.cpp:CPythonNetworkStream::SendQuestInputStringPacket" + ] + }, + "CPythonNetworkStream::SendQuestConfirmPacket": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGame.cpp:CPythonNetworkStream::SendQuestConfirmPacket" + ] + }, + "CPythonNetworkStream::RecvSkillCoolTimeEnd": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGame.cpp:CPythonNetworkStream::RecvSkillCoolTimeEnd" + ] + }, + "CPythonNetworkStream::RecvSkillLevel": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGame.cpp:CPythonNetworkStream::RecvSkillLevel" + ] + }, + "CPythonNetworkStream::RecvSkillLevelNew": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGame.cpp:CPythonNetworkStream::RecvSkillLevelNew" + ] + }, + "CPythonNetworkStream::RecvDamageInfoPacket": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGame.cpp:CPythonNetworkStream::RecvDamageInfoPacket" + ] + }, + "CPythonNetworkStream::RecvTargetPacket": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGame.cpp:CPythonNetworkStream::RecvTargetPacket" + ] + }, + "CPythonNetworkStream::RecvMountPacket": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGame.cpp:CPythonNetworkStream::RecvMountPacket" + ] + }, + "CPythonNetworkStream::RecvChangeSpeedPacket": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGame.cpp:CPythonNetworkStream::RecvChangeSpeedPacket" + ] + }, + "CPythonNetworkStream::SendAttackPacket": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGame.cpp:CPythonNetworkStream::SendAttackPacket" + ] + }, + "CPythonNetworkStream::SendSpecial": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGame.cpp:CPythonNetworkStream::SendSpecial" + ] + }, + "CPythonNetworkStream::RecvAddFlyTargetingPacket": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGame.cpp:CPythonNetworkStream::RecvAddFlyTargetingPacket" + ] + }, + "CPythonNetworkStream::RecvFlyTargetingPacket": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGame.cpp:CPythonNetworkStream::RecvFlyTargetingPacket" + ] + }, + "CPythonNetworkStream::SendShootPacket": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGame.cpp:CPythonNetworkStream::SendShootPacket" + ] + }, + "CPythonNetworkStream::SendAddFlyTargetingPacket": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGame.cpp:CPythonNetworkStream::SendAddFlyTargetingPacket" + ] + }, + "CPythonNetworkStream::SendFlyTargetingPacket": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGame.cpp:CPythonNetworkStream::SendFlyTargetingPacket" + ] + }, + "CPythonNetworkStream::RecvCreateFlyPacket": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGame.cpp:CPythonNetworkStream::RecvCreateFlyPacket" + ] + }, + "CPythonNetworkStream::SendTargetPacket": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGame.cpp:CPythonNetworkStream::SendTargetPacket" + ] + }, + "CPythonNetworkStream::SendSyncPositionElementPacket": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGame.cpp:CPythonNetworkStream::SendSyncPositionElementPacket" + ] + }, + "CPythonNetworkStream::RecvMessenger": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGame.cpp:CPythonNetworkStream::RecvMessenger" + ] + }, + "CPythonNetworkStream::SendPartyInvitePacket": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGame.cpp:CPythonNetworkStream::SendPartyInvitePacket" + ] + }, + "CPythonNetworkStream::SendPartyInviteAnswerPacket": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGame.cpp:CPythonNetworkStream::SendPartyInviteAnswerPacket" + ] + }, + "CPythonNetworkStream::SendPartyRemovePacket": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGame.cpp:CPythonNetworkStream::SendPartyRemovePacket" + ] + }, + "CPythonNetworkStream::SendPartySetStatePacket": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGame.cpp:CPythonNetworkStream::SendPartySetStatePacket" + ] + }, + "CPythonNetworkStream::SendPartyUseSkillPacket": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGame.cpp:CPythonNetworkStream::SendPartyUseSkillPacket" + ] + }, + "CPythonNetworkStream::SendPartyParameterPacket": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGame.cpp:CPythonNetworkStream::SendPartyParameterPacket" + ] + }, + "CPythonNetworkStream::RecvPartyInvite": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGame.cpp:CPythonNetworkStream::RecvPartyInvite" + ] + }, + "CPythonNetworkStream::RecvPartyAdd": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGame.cpp:CPythonNetworkStream::RecvPartyAdd" + ] + }, + "CPythonNetworkStream::RecvPartyUpdate": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGame.cpp:CPythonNetworkStream::RecvPartyUpdate" + ] + }, + "CPythonNetworkStream::RecvPartyRemove": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGame.cpp:CPythonNetworkStream::RecvPartyRemove" + ] + }, + "CPythonNetworkStream::RecvPartyLink": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGame.cpp:CPythonNetworkStream::RecvPartyLink" + ] + }, + "CPythonNetworkStream::RecvPartyUnlink": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGame.cpp:CPythonNetworkStream::RecvPartyUnlink" + ] + }, + "CPythonNetworkStream::RecvPartyParameter": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGame.cpp:CPythonNetworkStream::RecvPartyParameter" + ] + }, + "CPythonNetworkStream::SendGuildAddMemberPacket": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGame.cpp:CPythonNetworkStream::SendGuildAddMemberPacket" + ] + }, + "CPythonNetworkStream::SendGuildRemoveMemberPacket": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGame.cpp:CPythonNetworkStream::SendGuildRemoveMemberPacket" + ] + }, + "CPythonNetworkStream::SendGuildChangeGradeNamePacket": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGame.cpp:CPythonNetworkStream::SendGuildChangeGradeNamePacket" + ] + }, + "CPythonNetworkStream::SendGuildChangeGradeAuthorityPacket": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGame.cpp:CPythonNetworkStream::SendGuildChangeGradeAuthorityPacket" + ] + }, + "CPythonNetworkStream::SendGuildOfferPacket": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGame.cpp:CPythonNetworkStream::SendGuildOfferPacket" + ] + }, + "CPythonNetworkStream::SendGuildPostCommentPacket": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGame.cpp:CPythonNetworkStream::SendGuildPostCommentPacket" + ] + }, + "CPythonNetworkStream::SendGuildDeleteCommentPacket": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGame.cpp:CPythonNetworkStream::SendGuildDeleteCommentPacket" + ] + }, + "CPythonNetworkStream::SendGuildRefreshCommentsPacket": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGame.cpp:CPythonNetworkStream::SendGuildRefreshCommentsPacket" + ] + }, + "CPythonNetworkStream::SendGuildChangeMemberGradePacket": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGame.cpp:CPythonNetworkStream::SendGuildChangeMemberGradePacket" + ] + }, + "CPythonNetworkStream::SendGuildUseSkillPacket": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGame.cpp:CPythonNetworkStream::SendGuildUseSkillPacket" + ] + }, + "CPythonNetworkStream::SendGuildChangeMemberGeneralPacket": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGame.cpp:CPythonNetworkStream::SendGuildChangeMemberGeneralPacket" + ] + }, + "CPythonNetworkStream::SendGuildInviteAnswerPacket": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGame.cpp:CPythonNetworkStream::SendGuildInviteAnswerPacket" + ] + }, + "CPythonNetworkStream::SendGuildChargeGSPPacket": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGame.cpp:CPythonNetworkStream::SendGuildChargeGSPPacket" + ] + }, + "CPythonNetworkStream::SendGuildDepositMoneyPacket": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGame.cpp:CPythonNetworkStream::SendGuildDepositMoneyPacket" + ] + }, + "CPythonNetworkStream::SendGuildWithdrawMoneyPacket": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGame.cpp:CPythonNetworkStream::SendGuildWithdrawMoneyPacket" + ] + }, + "CPythonNetworkStream::RecvGuild": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGame.cpp:CPythonNetworkStream::RecvGuild" + ] + }, + "CPythonNetworkStream::SendFishingPacket": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGame.cpp:CPythonNetworkStream::SendFishingPacket" + ] + }, + "CPythonNetworkStream::SendGiveItemPacket": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGame.cpp:CPythonNetworkStream::SendGiveItemPacket" + ] + }, + "CPythonNetworkStream::RecvFishing": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGame.cpp:CPythonNetworkStream::RecvFishing" + ] + }, + "CPythonNetworkStream::RecvDungeon": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGame.cpp:CPythonNetworkStream::RecvDungeon" + ] + }, + "CPythonNetworkStream::SendBuildPrivateShopPacket": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGame.cpp:CPythonNetworkStream::SendBuildPrivateShopPacket" + ] + }, + "CPythonNetworkStream::RecvShopSignPacket": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGame.cpp:CPythonNetworkStream::RecvShopSignPacket" + ] + }, + "CPythonNetworkStream::RecvTimePacket": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGame.cpp:CPythonNetworkStream::RecvTimePacket" + ] + }, + "CPythonNetworkStream::RecvWalkModePacket": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGame.cpp:CPythonNetworkStream::RecvWalkModePacket" + ] + }, + "CPythonNetworkStream::RecvChangeSkillGroupPacket": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGame.cpp:CPythonNetworkStream::RecvChangeSkillGroupPacket" + ] + }, + "CPythonNetworkStream::__TEST_SetSkillGroupFake": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGame.cpp:CPythonNetworkStream::__TEST_SetSkillGroupFake" + ] + }, + "CPythonNetworkStream::SendRefinePacket": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGame.cpp:CPythonNetworkStream::SendRefinePacket" + ] + }, + "CPythonNetworkStream::SendSelectItemPacket": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGame.cpp:CPythonNetworkStream::SendSelectItemPacket" + ] + }, + "CPythonNetworkStream::RecvRefineInformationPacket": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGame.cpp:CPythonNetworkStream::RecvRefineInformationPacket" + ] + }, + "CPythonNetworkStream::RecvRefineInformationPacketNew": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGame.cpp:CPythonNetworkStream::RecvRefineInformationPacketNew" + ] + }, + "CPythonNetworkStream::RecvNPCList": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGame.cpp:CPythonNetworkStream::RecvNPCList" + ] + }, + "CPythonNetworkStream::__SendCRCReportPacket": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGame.cpp:CPythonNetworkStream::__SendCRCReportPacket" + ] + }, + "CPythonNetworkStream::SendClientVersionPacket": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGame.cpp:CPythonNetworkStream::SendClientVersionPacket" + ] + }, + "CPythonNetworkStream::RecvAffectAddPacket": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGame.cpp:CPythonNetworkStream::RecvAffectAddPacket" + ] + }, + "CPythonNetworkStream::RecvAffectRemovePacket": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGame.cpp:CPythonNetworkStream::RecvAffectRemovePacket" + ] + }, + "CPythonNetworkStream::RecvChannelPacket": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGame.cpp:CPythonNetworkStream::RecvChannelPacket" + ] + }, + "CPythonNetworkStream::RecvViewEquipPacket": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGame.cpp:CPythonNetworkStream::RecvViewEquipPacket" + ] + }, + "CPythonNetworkStream::RecvLandPacket": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGame.cpp:CPythonNetworkStream::RecvLandPacket" + ] + }, + "CPythonNetworkStream::RecvTargetCreatePacket": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGame.cpp:CPythonNetworkStream::RecvTargetCreatePacket" + ] + }, + "CPythonNetworkStream::RecvTargetCreatePacketNew": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGame.cpp:CPythonNetworkStream::RecvTargetCreatePacketNew" + ] + }, + "CPythonNetworkStream::RecvTargetUpdatePacket": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGame.cpp:CPythonNetworkStream::RecvTargetUpdatePacket" + ] + }, + "CPythonNetworkStream::RecvTargetDeletePacket": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGame.cpp:CPythonNetworkStream::RecvTargetDeletePacket" + ] + }, + "CPythonNetworkStream::RecvLoverInfoPacket": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGame.cpp:CPythonNetworkStream::RecvLoverInfoPacket" + ] + }, + "CPythonNetworkStream::RecvLovePointUpdatePacket": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGame.cpp:CPythonNetworkStream::RecvLovePointUpdatePacket" + ] + }, + "CPythonNetworkStream::RecvDigMotionPacket": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGame.cpp:CPythonNetworkStream::RecvDigMotionPacket" + ] + }, + "CPythonNetworkStream::SendDragonSoulRefinePacket": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGame.cpp:CPythonNetworkStream::SendDragonSoulRefinePacket" + ] + }, + "CPythonNetworkStream::Discord_Start": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGame.cpp:CPythonNetworkStream::Discord_Start" + ] + }, + "CPythonNetworkStream::Discord_Update": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGame.cpp:CPythonNetworkStream::Discord_Update" + ] + }, + "CPythonNetworkStream::Discord_Close": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGame.cpp:CPythonNetworkStream::Discord_Close" + ] + } + } +} diff --git a/audit/port-map/UserInterface/PythonNetworkStreamPhaseGameActor.cpp.json b/audit/port-map/UserInterface/PythonNetworkStreamPhaseGameActor.cpp.json new file mode 100644 index 00000000..d7d8e9e2 --- /dev/null +++ b/audit/port-map/UserInterface/PythonNetworkStreamPhaseGameActor.cpp.json @@ -0,0 +1,110 @@ +{ + "reference": "UserInterface/PythonNetworkStreamPhaseGameActor.cpp", + "reference_sha256": "b62fd266ef028167d4901469eaaa1c9119d993b67aa45c27527270d3ba9a5b0d", + "priority": "P2", + "contracts": [], + "functions": { + "CPythonNetworkStream::__GlobalPositionToLocalPosition": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGameActor.cpp:CPythonNetworkStream::__GlobalPositionToLocalPosition" + ] + }, + "CPythonNetworkStream::__LocalPositionToGlobalPosition": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGameActor.cpp:CPythonNetworkStream::__LocalPositionToGlobalPosition" + ] + }, + "CPythonNetworkStream::__CanActMainInstance": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGameActor.cpp:CPythonNetworkStream::__CanActMainInstance" + ] + }, + "CPythonNetworkStream::__ClearNetworkActorManager": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGameActor.cpp:CPythonNetworkStream::__ClearNetworkActorManager" + ] + }, + "__SetWeaponPower": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGameActor.cpp:__SetWeaponPower" + ] + }, + "IsInvisibleRace": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGameActor.cpp:IsInvisibleRace" + ] + }, + "CPythonNetworkStream::RecvCharacterAppendPacket": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGameActor.cpp:CPythonNetworkStream::RecvCharacterAppendPacket" + ] + }, + "CPythonNetworkStream::RecvCharacterAdditionalInfo": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGameActor.cpp:CPythonNetworkStream::RecvCharacterAdditionalInfo" + ] + }, + "CPythonNetworkStream::RecvCharacterAppendPacketNew": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGameActor.cpp:CPythonNetworkStream::RecvCharacterAppendPacketNew" + ] + }, + "CPythonNetworkStream::RecvCharacterUpdatePacket": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGameActor.cpp:CPythonNetworkStream::RecvCharacterUpdatePacket" + ] + }, + "CPythonNetworkStream::RecvCharacterUpdatePacketNew": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGameActor.cpp:CPythonNetworkStream::RecvCharacterUpdatePacketNew" + ] + }, + "CPythonNetworkStream::__RecvCharacterAppendPacket": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGameActor.cpp:CPythonNetworkStream::__RecvCharacterAppendPacket" + ] + }, + "CPythonNetworkStream::__RecvCharacterUpdatePacket": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGameActor.cpp:CPythonNetworkStream::__RecvCharacterUpdatePacket" + ] + }, + "CPythonNetworkStream::RecvCharacterDeletePacket": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGameActor.cpp:CPythonNetworkStream::RecvCharacterDeletePacket" + ] + }, + "CPythonNetworkStream::RecvCharacterMovePacket": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGameActor.cpp:CPythonNetworkStream::RecvCharacterMovePacket" + ] + }, + "CPythonNetworkStream::RecvOwnerShipPacket": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGameActor.cpp:CPythonNetworkStream::RecvOwnerShipPacket" + ] + }, + "CPythonNetworkStream::RecvSyncPositionPacket": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGameActor.cpp:CPythonNetworkStream::RecvSyncPositionPacket" + ] + } + } +} diff --git a/audit/port-map/UserInterface/PythonNetworkStreamPhaseGameItem.cpp.json b/audit/port-map/UserInterface/PythonNetworkStreamPhaseGameItem.cpp.json new file mode 100644 index 00000000..b83dc2d0 --- /dev/null +++ b/audit/port-map/UserInterface/PythonNetworkStreamPhaseGameItem.cpp.json @@ -0,0 +1,272 @@ +{ + "reference": "UserInterface/PythonNetworkStreamPhaseGameItem.cpp", + "reference_sha256": "eea34b48af0e7e1b1340ca6e72f708882b3db108b2f80c82842a9cc67f2348a2", + "priority": "P2", + "contracts": [], + "functions": { + "CPythonNetworkStream::SendSafeBoxMoneyPacket": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGameItem.cpp:CPythonNetworkStream::SendSafeBoxMoneyPacket" + ] + }, + "CPythonNetworkStream::SendSafeBoxCheckinPacket": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGameItem.cpp:CPythonNetworkStream::SendSafeBoxCheckinPacket" + ] + }, + "CPythonNetworkStream::SendSafeBoxCheckoutPacket": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGameItem.cpp:CPythonNetworkStream::SendSafeBoxCheckoutPacket" + ] + }, + "CPythonNetworkStream::SendSafeBoxItemMovePacket": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGameItem.cpp:CPythonNetworkStream::SendSafeBoxItemMovePacket" + ] + }, + "CPythonNetworkStream::RecvSafeBoxSetPacket": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGameItem.cpp:CPythonNetworkStream::RecvSafeBoxSetPacket" + ] + }, + "CPythonNetworkStream::RecvSafeBoxDelPacket": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGameItem.cpp:CPythonNetworkStream::RecvSafeBoxDelPacket" + ] + }, + "CPythonNetworkStream::RecvSafeBoxWrongPasswordPacket": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGameItem.cpp:CPythonNetworkStream::RecvSafeBoxWrongPasswordPacket" + ] + }, + "CPythonNetworkStream::RecvSafeBoxSizePacket": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGameItem.cpp:CPythonNetworkStream::RecvSafeBoxSizePacket" + ] + }, + "CPythonNetworkStream::RecvSafeBoxMoneyChangePacket": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGameItem.cpp:CPythonNetworkStream::RecvSafeBoxMoneyChangePacket" + ] + }, + "CPythonNetworkStream::SendMallCheckoutPacket": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGameItem.cpp:CPythonNetworkStream::SendMallCheckoutPacket" + ] + }, + "CPythonNetworkStream::RecvMallOpenPacket": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGameItem.cpp:CPythonNetworkStream::RecvMallOpenPacket" + ] + }, + "CPythonNetworkStream::RecvMallItemSetPacket": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGameItem.cpp:CPythonNetworkStream::RecvMallItemSetPacket" + ] + }, + "CPythonNetworkStream::RecvMallItemDelPacket": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGameItem.cpp:CPythonNetworkStream::RecvMallItemDelPacket" + ] + }, + "CPythonNetworkStream::RecvItemSetPacket": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGameItem.cpp:CPythonNetworkStream::RecvItemSetPacket" + ] + }, + "CPythonNetworkStream::RecvItemSetPacket2": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGameItem.cpp:CPythonNetworkStream::RecvItemSetPacket2" + ] + }, + "CPythonNetworkStream::RecvItemUsePacket": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGameItem.cpp:CPythonNetworkStream::RecvItemUsePacket" + ] + }, + "CPythonNetworkStream::RecvItemUpdatePacket": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGameItem.cpp:CPythonNetworkStream::RecvItemUpdatePacket" + ] + }, + "CPythonNetworkStream::RecvItemGroundAddPacket": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGameItem.cpp:CPythonNetworkStream::RecvItemGroundAddPacket" + ] + }, + "CPythonNetworkStream::RecvItemOwnership": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGameItem.cpp:CPythonNetworkStream::RecvItemOwnership" + ] + }, + "CPythonNetworkStream::RecvItemGroundDelPacket": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGameItem.cpp:CPythonNetworkStream::RecvItemGroundDelPacket" + ] + }, + "CPythonNetworkStream::RecvQuickSlotAddPacket": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGameItem.cpp:CPythonNetworkStream::RecvQuickSlotAddPacket" + ] + }, + "CPythonNetworkStream::RecvQuickSlotDelPacket": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGameItem.cpp:CPythonNetworkStream::RecvQuickSlotDelPacket" + ] + }, + "CPythonNetworkStream::RecvQuickSlotMovePacket": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGameItem.cpp:CPythonNetworkStream::RecvQuickSlotMovePacket" + ] + }, + "CPythonNetworkStream::SendShopEndPacket": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGameItem.cpp:CPythonNetworkStream::SendShopEndPacket" + ] + }, + "CPythonNetworkStream::SendShopBuyPacket": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGameItem.cpp:CPythonNetworkStream::SendShopBuyPacket" + ] + }, + "CPythonNetworkStream::SendShopSellPacket": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGameItem.cpp:CPythonNetworkStream::SendShopSellPacket" + ] + }, + "CPythonNetworkStream::SendShopSellPacketNew": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGameItem.cpp:CPythonNetworkStream::SendShopSellPacketNew" + ] + }, + "CPythonNetworkStream::SendItemUsePacket": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGameItem.cpp:CPythonNetworkStream::SendItemUsePacket" + ] + }, + "CPythonNetworkStream::SendItemUseToItemPacket": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGameItem.cpp:CPythonNetworkStream::SendItemUseToItemPacket" + ] + }, + "CPythonNetworkStream::SendItemDropPacket": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGameItem.cpp:CPythonNetworkStream::SendItemDropPacket" + ] + }, + "CPythonNetworkStream::SendItemDropPacketNew": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGameItem.cpp:CPythonNetworkStream::SendItemDropPacketNew" + ] + }, + "CPythonNetworkStream::__IsEquipItemInSlot": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGameItem.cpp:CPythonNetworkStream::__IsEquipItemInSlot" + ] + }, + "CPythonNetworkStream::__PlayInventoryItemUseSound": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGameItem.cpp:CPythonNetworkStream::__PlayInventoryItemUseSound" + ] + }, + "CPythonNetworkStream::__PlayInventoryItemDropSound": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGameItem.cpp:CPythonNetworkStream::__PlayInventoryItemDropSound" + ] + }, + "CPythonNetworkStream::__PlaySafeBoxItemDropSound": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGameItem.cpp:CPythonNetworkStream::__PlaySafeBoxItemDropSound" + ] + }, + "CPythonNetworkStream::__PlayMallItemDropSound": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGameItem.cpp:CPythonNetworkStream::__PlayMallItemDropSound" + ] + }, + "CPythonNetworkStream::SendItemMovePacket": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGameItem.cpp:CPythonNetworkStream::SendItemMovePacket" + ] + }, + "CPythonNetworkStream::SendItemPickUpPacket": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGameItem.cpp:CPythonNetworkStream::SendItemPickUpPacket" + ] + }, + "CPythonNetworkStream::SendQuickSlotAddPacket": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGameItem.cpp:CPythonNetworkStream::SendQuickSlotAddPacket" + ] + }, + "CPythonNetworkStream::SendQuickSlotDelPacket": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGameItem.cpp:CPythonNetworkStream::SendQuickSlotDelPacket" + ] + }, + "CPythonNetworkStream::SendQuickSlotMovePacket": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGameItem.cpp:CPythonNetworkStream::SendQuickSlotMovePacket" + ] + }, + "CPythonNetworkStream::RecvSpecialEffect": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGameItem.cpp:CPythonNetworkStream::RecvSpecialEffect" + ] + }, + "CPythonNetworkStream::RecvSpecificEffect": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGameItem.cpp:CPythonNetworkStream::RecvSpecificEffect" + ] + }, + "CPythonNetworkStream::RecvDragonSoulRefine": { + "status": "PORTED", + "impl": [ + "extension/src/port/UserInterface/PythonNetworkStreamPhaseGameItem.cpp:CPythonNetworkStream::RecvDragonSoulRefine" + ] + } + } +} diff --git a/docs/PORT-PLAN.md b/docs/PORT-PLAN.md index cc8c0da0..588acb24 100644 --- a/docs/PORT-PLAN.md +++ b/docs/PORT-PLAN.md @@ -420,9 +420,9 @@ extension/third_party/cpython-2.7.18/ # 静态库(2P 批次 | 子步骤 | 内容 | 状态 | | --- | --- | --- | | 2V2-a | Loading 结束后打开 `game.GameWindow`,发 `CG_ENTERGAME` | 完成:2V0 桩模块的常量与返回值形状改为按 40250 生成(`scripts/stub_constants.py`:常量逐行抄各模块 init 的 `PyModule_Add*Constant` 及其预处理行/枚举/`extern const` 定义,写到 `platform/ScriptLib/GameplayModuleConstants.cpp`;桩函数返回参考函数最后一个 `return` 的 `Py_BuildValue` 格式的零值或 None,而不是一律 `int 0`),`uiSafebox.SetTableSize` 的除零和 `uiTaskBar` 解包失败随之消失,`interfaceModule.MakeInterface` 走完。修正:`UserInterface/StdAfx.h` 按 40250 PCH 顺序先 `Locale.h` 后 `GameType.h`(之前反了,`GameType.h` 里 `ENABLE_NEW_EQUIPMENT_SYSTEM` 分支全被丢掉)。`port.login_flow` 假服在 `CG_CLIENT_VERSION` 后收 `CG_ENTERGAME`(校验序列字节),测试等到 `GameWindow` 显示;`port.login_live` 2026-09-23 对 192.168.21.203 同样走到 `GameWindow`。`GamePhase`/`SetGamePhase` 仍是替身:服务器的 PHASE_GAME 及 Loading 阶段落到 `GamePhase()` 的包会卡住读流 | - | 2V2-b | `PythonNetworkStreamPhaseGame*.cpp` 分派闭包:`SetGamePhase`/`GamePhase`,PHASE_GAME 后的 Entergame 包洪流(`GC_TIME`/`GC_CHANNEL`/`GC_CHARACTER_ADD`/`GC_CHAR_ADDITIONAL_INFO`/`GC_CHARACTER_UPDATE`/技能/物品/快捷栏…)读流不断 | TODO | - | 2V2-c | `PythonCharacterManager` + `chrmgr`/`chr` 模块:`playerSettingModule` 的种族/动作/特效注册走真实实现 | TODO | - | 2V2-d | `InstanceBase` + `ActorInstance` + `CGraphicThingInstance` adapter:`GC_CHARACTER_ADD` 创建主角实例(msm 模型 + 待机动作) | TODO | + | 2V2-b | `PythonNetworkStreamPhaseGame*.cpp` 分派闭包:`SetGamePhase`/`GamePhase`,PHASE_GAME 后的 Entergame 包洪流(`GC_TIME`/`GC_CHANNEL`/`GC_CHARACTER_ADD`/`GC_CHAR_ADDITIONAL_INFO`/`GC_CHARACTER_UPDATE`/技能/物品/快捷栏…)读流不断 | 完成:`PythonNetworkStreamPhaseGame`/`PhaseGameActor`/`PhaseGameItem`/`Command`、`NetworkActorManager` 原样移植并在运行时分派(port-map 标 PORTED);`GC_CHAT` 需要的 `PythonChat.cpp`/`PythonChatModule.cpp` 一并原样移植,`GameplayModules.cpp` 的 `chat` 桩删除,`initChat()` 按 40250 顺序在 `initnet()` 前调用。未移植单元的单例在 `PythonBoot` 的 `GameSingletons` 里按 `CPythonApplication` 成员顺序创建(calloc 存储:替身构造函数不初始化标量);替身由 `platform_stub.py pending
<符号...> [--ctor]` 按链接缺失符号生成到 `platform/pending//`,返回 `const char*` 的替身返回 `""`(`RecvGuild` 里 `strcmp(…, CPythonPlayer::GetName())`)。`port.login_flow` 假服按 `CInputLogin::Entergame` 顺序发:Loading 阶段 `CHARACTER_ADD`+`CHAR_ADDITIONAL_INFO`+`CHARACTER_UPDATE`、`NPC_POSITION` → `PHASE_GAME` → `LAND_LIST`、`TIME`、`CHANNEL`、问候 `CHAT` → `PING`,客户端回 `PONG`,公告进 `CPythonChat`,`TraceError` 观察钩子(`EterBase/TraceErrorObserver.h`)断言无 `Unknown packet header`。`port.login_live` 2026-09-23 对 192.168.21.203 读 10 s 真实游戏阶段:连接保持、GameWindow 显示、无未知包;剩下的 SYSERR 只有 `CreateInstance` 失败(2V2-d 的 `SetRace` 占位) | + | 2V2-c | `PythonCharacterManager` + `chrmgr`/`chr` 模块:`playerSettingModule` 的种族/动作/特效注册走真实实现 | 进行中:PythonCharacterManager 原版逻辑已编译;`chrmgr`/`chr` 仍是 2V0 桩,注册链未接通 | + | 2V2-d | `InstanceBase` + `ActorInstance` + `CGraphicThingInstance` adapter:`GC_CHARACTER_ADD` 创建主角实例(msm 模型 + 待机动作) | 进行中:InstanceBase、InstanceBaseMovement、ActorInstance 已编译;ActorInstanceData/RaceManager/RaceData 已照抄但未接通。主角创建测试明确失败于尚为占位的 `CActorInstance::SetRace`,继续接通仍需 RaceDataFile、RaceMotionData、AttributeInstance、角色注册和模型 adapter | | 2V2-e | Godot 显示主角(渲染 adapter),离线 + 真服 smoke:进游戏看到可辨认的静止角色 | TODO | 4. **2V3 — 本地移动**:加入 `PythonPlayer`、`PythonPlayerInput*`、`PythonPlayerEventHandler`、 `InstanceBaseMovement`、`ActorInstance{Motion,Event,Position,Rotation,CollisionDetection}` 的实际依赖闭包。验收为输入经过新路径 diff --git a/extension/src/platform/EterBase/Debug.cpp b/extension/src/platform/EterBase/Debug.cpp index 6e666225..3988d0e7 100644 --- a/extension/src/platform/EterBase/Debug.cpp +++ b/extension/src/platform/EterBase/Debug.cpp @@ -7,6 +7,7 @@ #include "../PlatformStub.h" #include "EterBase/Timer.h" #include "LogBox.h" +#include "TraceErrorObserver.h" #include #include @@ -15,6 +16,16 @@ const DWORD DEBUG_STRING_MAX_LEN = 1024; +namespace +{ +TraceErrorObserver g_trace_error_observer = nullptr; +} + +void SetTraceErrorObserver(TraceErrorObserver observer) +{ + g_trace_error_observer = observer; +} + auto SetLogLevel(UINT) -> void { MT_PLATFORM_STUB(); @@ -91,6 +102,8 @@ void TraceError(const char* c_szFormat, ...) ELTimer_GetMSec() % 60000, szBuf + 8); fflush(stderr); + if (g_trace_error_observer) + g_trace_error_observer(szBuf + 8); #endif } diff --git a/extension/src/platform/EterBase/TraceErrorObserver.h b/extension/src/platform/EterBase/TraceErrorObserver.h new file mode 100644 index 00000000..9a21d4ee --- /dev/null +++ b/extension/src/platform/EterBase/TraceErrorObserver.h @@ -0,0 +1,8 @@ +#pragma once +// Test hook: sees every TraceError line (without the "SYSERR: " prefix) after it is written to stderr. +// The 40250 client only writes these to syserr.txt; tests use it to fail on, e.g., the stream's +// "Unknown packet header" (CPythonNetworkStream::CheckPacket), which otherwise only clears the buffer. + +using TraceErrorObserver = void (*)(const char* line); + +void SetTraceErrorObserver(TraceErrorObserver observer); diff --git a/extension/src/platform/PlatformStub.h b/extension/src/platform/PlatformStub.h index 5ef9faf7..fca3ead7 100644 --- a/extension/src/platform/PlatformStub.h +++ b/extension/src/platform/PlatformStub.h @@ -35,6 +35,12 @@ T mt_platform_stub_return() return static_cast(*reinterpret_cast(storage)); } } + else if constexpr (std::is_same_v) + { + // Callers strcmp/strlen/format the names these return (CPythonPlayer::GetName in RecvGuild); a + // null string would crash where the real function never returns one. + return ""; + } else if constexpr (std::is_default_constructible_v) { return T{}; diff --git a/extension/src/platform/ScriptLib/GameplayModuleConstants.cpp b/extension/src/platform/ScriptLib/GameplayModuleConstants.cpp index 60b1252f..e5e529d7 100644 --- a/extension/src/platform/ScriptLib/GameplayModuleConstants.cpp +++ b/extension/src/platform/ScriptLib/GameplayModuleConstants.cpp @@ -75,28 +75,6 @@ void AddStubConstants_background(PyObject* poModule) PyModule_AddIntConstant(poModule, "TEXTURE_SORT", CMapOutdoor::TEXTURE_SORT); } -// 40250 UserInterface/PythonChatModule.cpp -void AddStubConstants_chat(PyObject* poModule) -{ - (void) poModule; - PyModule_AddIntConstant(poModule, "CHAT_TYPE_TALKING", CHAT_TYPE_TALKING); - PyModule_AddIntConstant(poModule, "CHAT_TYPE_INFO", CHAT_TYPE_INFO); - PyModule_AddIntConstant(poModule, "CHAT_TYPE_NOTICE", CHAT_TYPE_NOTICE); - PyModule_AddIntConstant(poModule, "CHAT_TYPE_PARTY", CHAT_TYPE_PARTY); - PyModule_AddIntConstant(poModule, "CHAT_TYPE_GUILD", CHAT_TYPE_GUILD); - PyModule_AddIntConstant(poModule, "CHAT_TYPE_COMMAND", CHAT_TYPE_COMMAND); - PyModule_AddIntConstant(poModule, "CHAT_TYPE_SHOUT", CHAT_TYPE_SHOUT); - PyModule_AddIntConstant(poModule, "CHAT_TYPE_WHISPER", CHAT_TYPE_WHISPER); - PyModule_AddIntConstant(poModule, "WHISPER_TYPE_CHAT", CPythonChat::WHISPER_TYPE_CHAT); - PyModule_AddIntConstant(poModule, "WHISPER_TYPE_SYSTEM", CPythonChat::WHISPER_TYPE_SYSTEM); - PyModule_AddIntConstant(poModule, "WHISPER_TYPE_GM", CPythonChat::WHISPER_TYPE_GM); - PyModule_AddIntConstant(poModule, "BOARD_STATE_VIEW", CPythonChat::BOARD_STATE_VIEW); - PyModule_AddIntConstant(poModule, "BOARD_STATE_EDIT", CPythonChat::BOARD_STATE_EDIT); - PyModule_AddIntConstant(poModule, "BOARD_STATE_LOG", CPythonChat::BOARD_STATE_LOG); - PyModule_AddIntConstant(poModule, "CHAT_SET_CHAT_WINDOW", 0); - PyModule_AddIntConstant(poModule, "CHAT_SET_LOG_WINDOW", 1); -} - // 40250 UserInterface/PythonCharacterModule.cpp void AddStubConstants_chr(PyObject* poModule) { diff --git a/extension/src/platform/ScriptLib/GameplayModules.cpp b/extension/src/platform/ScriptLib/GameplayModules.cpp index 4326feda..c8835b23 100644 --- a/extension/src/platform/ScriptLib/GameplayModules.cpp +++ b/extension/src/platform/ScriptLib/GameplayModules.cpp @@ -7,7 +7,6 @@ // GameplayModuleConstants.cpp: each module's 40250 constants. void AddStubConstants_ServerStateChecker(PyObject* poModule); void AddStubConstants_background(PyObject* poModule); -void AddStubConstants_chat(PyObject* poModule); void AddStubConstants_chr(PyObject* poModule); void AddStubConstants_chrmgr(PyObject* poModule); void AddStubConstants_effect(PyObject* poModule); @@ -154,70 +153,6 @@ PyMethodDef methods_background[] = { { "WarpTest", stub_background_WarpTest, METH_VARARGS }, { NULL, NULL } }; -// 40250 UserInterface/PythonChatModule.cpp: chat export names. -PyObject* stub_chat_SetChatColor(PyObject*, PyObject*) { return stub_call_named("chat.SetChatColor", Py_BuildNone()); } -PyObject* stub_chat_Clear(PyObject*, PyObject*) { return stub_call_named("chat.Clear", Py_BuildNone()); } -PyObject* stub_chat_Close(PyObject*, PyObject*) { return stub_call_named("chat.Close", Py_BuildNone()); } -PyObject* stub_chat_CreateChatSet(PyObject*, PyObject*) { return stub_call_named("chat.CreateChatSet", Py_BuildValue("i", 0)); } -PyObject* stub_chat_Update(PyObject*, PyObject*) { return stub_call_named("chat.Update", Py_BuildNone()); } -PyObject* stub_chat_Render(PyObject*, PyObject*) { return stub_call_named("chat.Render", Py_BuildNone()); } -PyObject* stub_chat_SetBoardState(PyObject*, PyObject*) { return stub_call_named("chat.SetBoardState", Py_BuildNone()); } -PyObject* stub_chat_SetPosition(PyObject*, PyObject*) { return stub_call_named("chat.SetPosition", Py_BuildNone()); } -PyObject* stub_chat_SetHeight(PyObject*, PyObject*) { return stub_call_named("chat.SetHeight", Py_BuildNone()); } -PyObject* stub_chat_SetStep(PyObject*, PyObject*) { return stub_call_named("chat.SetStep", Py_BuildNone()); } -PyObject* stub_chat_ToggleChatMode(PyObject*, PyObject*) { return stub_call_named("chat.ToggleChatMode", Py_BuildNone()); } -PyObject* stub_chat_EnableChatMode(PyObject*, PyObject*) { return stub_call_named("chat.EnableChatMode", Py_BuildNone()); } -PyObject* stub_chat_DisableChatMode(PyObject*, PyObject*) { return stub_call_named("chat.DisableChatMode", Py_BuildNone()); } -PyObject* stub_chat_SetEndPos(PyObject*, PyObject*) { return stub_call_named("chat.SetEndPos", Py_BuildNone()); } -PyObject* stub_chat_GetLineCount(PyObject*, PyObject*) { return stub_call_named("chat.GetLineCount", Py_BuildValue("i", 0)); } -PyObject* stub_chat_GetVisibleLineCount(PyObject*, PyObject*) { return stub_call_named("chat.GetVisibleLineCount", Py_BuildValue("i", 0)); } -PyObject* stub_chat_GetLineStep(PyObject*, PyObject*) { return stub_call_named("chat.GetLineStep", Py_BuildValue("i", 0)); } -PyObject* stub_chat_AppendChat(PyObject*, PyObject*) { return stub_call_named("chat.AppendChat", Py_BuildNone()); } -PyObject* stub_chat_AppendChatWithDelay(PyObject*, PyObject*) { return stub_call_named("chat.AppendChatWithDelay", Py_BuildNone()); } -PyObject* stub_chat_ArrangeShowingChat(PyObject*, PyObject*) { return stub_call_named("chat.ArrangeShowingChat", Py_BuildNone()); } -PyObject* stub_chat_IgnoreCharacter(PyObject*, PyObject*) { return stub_call_named("chat.IgnoreCharacter", Py_BuildNone()); } -PyObject* stub_chat_IsIgnoreCharacter(PyObject*, PyObject*) { return stub_call_named("chat.IsIgnoreCharacter", Py_BuildNone()); } -PyObject* stub_chat_CreateWhisper(PyObject*, PyObject*) { return stub_call_named("chat.CreateWhisper", Py_BuildNone()); } -PyObject* stub_chat_AppendWhisper(PyObject*, PyObject*) { return stub_call_named("chat.AppendWhisper", Py_BuildNone()); } -PyObject* stub_chat_RenderWhisper(PyObject*, PyObject*) { return stub_call_named("chat.RenderWhisper", Py_BuildNone()); } -PyObject* stub_chat_SetWhisperBoxSize(PyObject*, PyObject*) { return stub_call_named("chat.SetWhisperBoxSize", Py_BuildNone()); } -PyObject* stub_chat_SetWhisperPosition(PyObject*, PyObject*) { return stub_call_named("chat.SetWhisperPosition", Py_BuildNone()); } -PyObject* stub_chat_ClearWhisper(PyObject*, PyObject*) { return stub_call_named("chat.ClearWhisper", Py_BuildNone()); } -PyObject* stub_chat_InitWhisper(PyObject*, PyObject*) { return stub_call_named("chat.InitWhisper", Py_BuildNone()); } -PyObject* stub_chat_GetLinkFromHyperlink(PyObject*, PyObject*) { return stub_call_named("chat.GetLinkFromHyperlink", Py_BuildValue("s", "")); } -PyMethodDef methods_chat[] = { - { "SetChatColor", stub_chat_SetChatColor, METH_VARARGS }, - { "Clear", stub_chat_Clear, METH_VARARGS }, - { "Close", stub_chat_Close, METH_VARARGS }, - { "CreateChatSet", stub_chat_CreateChatSet, METH_VARARGS }, - { "Update", stub_chat_Update, METH_VARARGS }, - { "Render", stub_chat_Render, METH_VARARGS }, - { "SetBoardState", stub_chat_SetBoardState, METH_VARARGS }, - { "SetPosition", stub_chat_SetPosition, METH_VARARGS }, - { "SetHeight", stub_chat_SetHeight, METH_VARARGS }, - { "SetStep", stub_chat_SetStep, METH_VARARGS }, - { "ToggleChatMode", stub_chat_ToggleChatMode, METH_VARARGS }, - { "EnableChatMode", stub_chat_EnableChatMode, METH_VARARGS }, - { "DisableChatMode", stub_chat_DisableChatMode, METH_VARARGS }, - { "SetEndPos", stub_chat_SetEndPos, METH_VARARGS }, - { "GetLineCount", stub_chat_GetLineCount, METH_VARARGS }, - { "GetVisibleLineCount", stub_chat_GetVisibleLineCount, METH_VARARGS }, - { "GetLineStep", stub_chat_GetLineStep, METH_VARARGS }, - { "AppendChat", stub_chat_AppendChat, METH_VARARGS }, - { "AppendChatWithDelay", stub_chat_AppendChatWithDelay, METH_VARARGS }, - { "ArrangeShowingChat", stub_chat_ArrangeShowingChat, METH_VARARGS }, - { "IgnoreCharacter", stub_chat_IgnoreCharacter, METH_VARARGS }, - { "IsIgnoreCharacter", stub_chat_IsIgnoreCharacter, METH_VARARGS }, - { "CreateWhisper", stub_chat_CreateWhisper, METH_VARARGS }, - { "AppendWhisper", stub_chat_AppendWhisper, METH_VARARGS }, - { "RenderWhisper", stub_chat_RenderWhisper, METH_VARARGS }, - { "SetWhisperBoxSize", stub_chat_SetWhisperBoxSize, METH_VARARGS }, - { "SetWhisperPosition", stub_chat_SetWhisperPosition, METH_VARARGS }, - { "ClearWhisper", stub_chat_ClearWhisper, METH_VARARGS }, - { "InitWhisper", stub_chat_InitWhisper, METH_VARARGS }, - { "GetLinkFromHyperlink", stub_chat_GetLinkFromHyperlink, METH_VARARGS }, - { NULL, NULL } -}; // 40250 UserInterface/PythonCharacterModule.cpp: chr export names. PyObject* stub_chr_DismountHorse(PyObject*, PyObject*) { return stub_call_named("chr.DismountHorse", Py_BuildNone()); } PyObject* stub_chr_MountHorse(PyObject*, PyObject*) { return stub_call_named("chr.MountHorse", Py_BuildNone()); } @@ -1502,11 +1437,6 @@ void init_2v0_gameplay_stubs() { PyModule_AddIntConstant(module, "__port_stub__", 1); AddStubConstants_background(module); } - { - PyObject* module = Py_InitModule("chat", methods_chat); - PyModule_AddIntConstant(module, "__port_stub__", 1); - AddStubConstants_chat(module); - } { PyObject* module = Py_InitModule("chr", methods_chr); PyModule_AddIntConstant(module, "__port_stub__", 1); diff --git a/extension/src/platform/ScriptLib/PythonBoot.cpp b/extension/src/platform/ScriptLib/PythonBoot.cpp index 434dd53c..40d831ab 100644 --- a/extension/src/platform/ScriptLib/PythonBoot.cpp +++ b/extension/src/platform/ScriptLib/PythonBoot.cpp @@ -12,12 +12,31 @@ #include "UserInterface/PythonPlayer.h" #include "GameLib/FlyingObjectManager.h" #include "EffectLib/EffectManager.h" +#include "GameLib/ItemManager.h" +#include "UserInterface/PythonCharacterManager.h" +#include "UserInterface/PythonItem.h" +#include "UserInterface/PythonShop.h" +#include "UserInterface/PythonExchange.h" +#include "UserInterface/PythonChat.h" +#include "UserInterface/PythonTextTail.h" +#include "UserInterface/PythonNonPlayer.h" +#include "UserInterface/PythonMiniMap.h" +#include "UserInterface/PythonEventManager.h" +#include "UserInterface/PythonBackground.h" +#include "UserInterface/PythonQuest.h" +#include "UserInterface/PythonMessenger.h" +#include "UserInterface/PythonSafeBox.h" +#include "UserInterface/PythonGuild.h" +#include "UserInterface/AbstractApplication.h" +#include "UserInterface/PythonApplication.h" +#include "EterBase/Timer.h" #include "PythonBoot.h" #include "PythonHost.h" #include "../EterLib/UIRenderCommands.h" #include "../EterBase/LogBox.h" #include +#include #include #include #include @@ -39,6 +58,61 @@ std::unique_ptr g_account_connector; std::unique_ptr g_player; std::unique_ptr g_flying_manager; std::unique_ptr g_effect_manager; +// PORT: CPythonApplication is not constructed by the Godot host yet. GamePhase calls the +// 40250 IAbstractApplication singleton, so expose the host's current timer and camera surface. +class GameApplicationAdapter final : public IAbstractApplication +{ +public: + void GetMousePosition(POINT* point) override { if (point) *point = {}; } + float GetGlobalTime() override { return CTimer::Instance().GetCurrentSecond(); } + float GetGlobalElapsedTime() override { return CTimer::Instance().GetElapsedSecond(); } + void SkipRenderBuffering(DWORD) override {} + void SetServerTime(time_t) override {} + void SetCenterPosition(float x, float y, float z) override + { + CPythonApplication::Instance().SetCenterPosition(x, y, z); + } + void SetEventCamera(const SCameraSetting& setting) override + { + CPythonApplication::Instance().SetEventCamera(setting); + } + void BlendEventCamera(const SCameraSetting&, float) override {} + void SetDefaultCamera() override { CPythonApplication::Instance().SetDefaultCamera(); } + void RunIMEUpdate() override {} + void RunIMETabEvent() override {} + void RunIMEReturnEvent() override {} + void RunIMEChangeCodePage() override {} + void RunIMEOpenCandidateListEvent() override {} + void RunIMECloseCandidateListEvent() override {} + void RunIMEOpenReadingWndEvent() override {} + void RunIMECloseReadingWndEvent() override {} +}; +std::unique_ptr g_game_application; +// The CPythonApplication members the game phase reaches through Instance() (批次 2V2), in 40250's member +// order. All are platform/pending stand-ins so far: their stub constructors leave scalar members unset, so +// the object is built in zeroed storage and inline header accessors read null/0 rather than garbage. +struct GameSingletons +{ + static void* operator new(size_t size) { return std::calloc(1, size); } + static void operator delete(void* p) { std::free(p); } + + CItemManager kItemMgr; + CPythonCharacterManager kChrMgr; + CPythonItem pyItem; + CPythonShop pyShop; + CPythonExchange pyExchange; + CPythonChat pyChat; + CPythonTextTail pyTextTail; + CPythonNonPlayer pyNonPlayer; + CPythonMiniMap pyMiniMap; + CPythonEventManager pyEventManager; + CPythonBackground pyBackground; + CPythonQuest pyQuest; + CPythonMessenger pyManager; + CPythonSafeBox pySafeBox; + CPythonGuild pyGuild; +}; +std::unique_ptr g_game_singletons; bool fail(std::string* error, const std::string& text) { @@ -225,6 +299,8 @@ bool Start(const char* stdlib_path, std::string* error) g_player = std::make_unique(); g_flying_manager = std::make_unique(); g_effect_manager = std::make_unique(); + g_game_application = std::make_unique(); + g_game_singletons = std::make_unique(); return true; } @@ -245,6 +321,7 @@ bool run_main_script_body(const char* lpCmdLine, std::string* error) initgrpText(); initwndMgr(); initapp(); + initChat(); initnet(); init_2v0_gameplay_stubs(); @@ -411,6 +488,8 @@ void Stop() // 40250 Main(): pyLauncher.Clear() runs before app->Destroy()/delete app, so the window manager // (a CPythonApplication member) is still alive while Py_Finalize runs the windows' __del__. g_launcher->Clear(); + g_game_singletons.reset(); + g_game_application.reset(); g_effect_manager.reset(); g_flying_manager.reset(); g_player.reset(); diff --git a/extension/src/platform/UserInterface/PythonApplication.cpp b/extension/src/platform/UserInterface/PythonApplication.cpp index ba9ec160..40d1782b 100644 --- a/extension/src/platform/UserInterface/PythonApplication.cpp +++ b/extension/src/platform/UserInterface/PythonApplication.cpp @@ -169,15 +169,11 @@ void CMovieMan::PlayLogo(const char*) { MT_PLATFORM_STUB(); } float GetDegreeDifference(float, float) { MT_PLATFORM_STUB(); return 0; } int GetRotatingDirection(float, float) { MT_PLATFORM_STUB(); return 0; } -BOOL HAIR_COLOR_ENABLE = FALSE; BOOL PERF_CHECKER_RENDER_GAME = FALSE; -BOOL RIDE_HORSE_ENABLE = FALSE; BOOL SKILL_EFFECT_UPGRADE_ENABLE = FALSE; -BOOL USE_ARMOR_SPECULAR = FALSE; BOOL USE_WEAPON_SPECULAR = FALSE; D3DXCOLOR g_fSpecularColor; double g_specularSpd = 0; -int g_iAccumulationTime = 0; bool LoadLocaleData(const char*) { MT_PLATFORM_STUB(); return false; } void SetGuildSymbolPath(const char*) { MT_PLATFORM_STUB(); } diff --git a/extension/src/platform/pending/EterLib/AttributeInstance.cpp b/extension/src/platform/pending/EterLib/AttributeInstance.cpp new file mode 100644 index 00000000..0102b3d7 --- /dev/null +++ b/extension/src/platform/pending/EterLib/AttributeInstance.cpp @@ -0,0 +1,23 @@ +// Stand-in for the 40250 logic unit EterLib/AttributeInstance.cpp, not ported yet: the members the ported units +// reference, as platform_stub.py stubs. Delete this file in the commit that ports the unit into port/ +// (docs/PORT-PLAN.md). +#include "EterLib/StdAfx.h" +#include "EterLib/AttributeInstance.h" + +#include "../../PlatformStub.h" + +auto CAttributeInstance::Clear() -> void +{ + MT_PLATFORM_STUB(); +} + +auto CAttributeInstance::GetHeight(float, float, float *) -> BOOL +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CAttributeInstance::Delete(CAttributeInstance *) -> void +{ + MT_PLATFORM_STUB(); +} diff --git a/extension/src/platform/pending/EterLib/CollisionData.cpp b/extension/src/platform/pending/EterLib/CollisionData.cpp new file mode 100644 index 00000000..90faca5e --- /dev/null +++ b/extension/src/platform/pending/EterLib/CollisionData.cpp @@ -0,0 +1,23 @@ +// Stand-in for the 40250 logic unit EterLib/CollisionData.cpp, not ported yet: the members the ported units +// reference, as platform_stub.py stubs. Delete this file in the commit that ports the unit into port/ +// (docs/PORT-PLAN.md). +#include "EterLib/StdAfx.h" +#include "EterLib/CollisionData.h" + +#include "../../PlatformStub.h" + +auto CSphereCollisionInstance::GetAttribute() -> TSphereData & +{ + MT_PLATFORM_STUB(); + return m_attribute; +} + +auto CSphereCollisionInstance::GetAttribute() const -> const TSphereData & { return m_attribute; } +auto CSphereCollisionInstance::Render(D3DFILLMODE) -> void { MT_PLATFORM_STUB(); } +auto CSphereCollisionInstance::OnDestroy() -> void { MT_PLATFORM_STUB(); } +auto CSphereCollisionInstance::OnMovementCollisionDynamicSphere(const CDynamicSphereInstance&) const -> bool +{ MT_PLATFORM_STUB(); return false; } +auto CSphereCollisionInstance::OnCollisionDynamicSphere(const CDynamicSphereInstance&) const -> bool +{ MT_PLATFORM_STUB(); return false; } +auto CSphereCollisionInstance::OnGetCollisionMovementAdjust(const CDynamicSphereInstance&) const -> D3DXVECTOR3 +{ MT_PLATFORM_STUB(); return D3DXVECTOR3(0, 0, 0); } diff --git a/extension/src/platform/pending/GameLib/ActorInstance.cpp b/extension/src/platform/pending/GameLib/ActorInstance.cpp new file mode 100644 index 00000000..416870a4 --- /dev/null +++ b/extension/src/platform/pending/GameLib/ActorInstance.cpp @@ -0,0 +1,565 @@ +// Stand-in for the 40250 logic unit GameLib/ActorInstance.cpp, not ported yet: the members the ported units +// reference, as platform_stub.py stubs. Delete this file in the commit that ports the unit into port/ +// (docs/PORT-PLAN.md). +#include "GameLib/StdAfx.h" +#include "GameLib/ActorInstance.h" + +#include "../../PlatformStub.h" + +auto CActorInstance::IEventHandler::GetEmptyPtr() -> IEventHandler * +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CActorInstance::IsDirLine() -> bool +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CActorInstance::SetMaterialColor(DWORD) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CActorInstance::SetEventHandler(IEventHandler *) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CActorInstance::SetRace(DWORD) -> bool +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CActorInstance::SetHair(DWORD) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CActorInstance::SetVirtualID(DWORD) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CActorInstance::SetShape(DWORD, float) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CActorInstance::ChangeMaterial(const char *) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CActorInstance::GetRace() -> DWORD +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CActorInstance::GetVirtualID() -> DWORD +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CActorInstance::CanAct() -> bool +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CActorInstance::CanMove() -> bool +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CActorInstance::CanAttack() -> bool +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CActorInstance::CanUseSkill() -> bool +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CActorInstance::AttachWeapon(DWORD, DWORD, DWORD) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CActorInstance::RefreshActorInstance() -> void +{ + MT_PLATFORM_STUB(); +} + +auto CActorInstance::GetPartItemID(DWORD) -> DWORD +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CActorInstance::UpdateAttachingInstances() -> void +{ + MT_PLATFORM_STUB(); +} + +auto CActorInstance::SetMotionMode(int) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CActorInstance::GetMotionMode() -> int +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CActorInstance::SetLoopMotion(DWORD, float, float) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CActorInstance::InterceptOnceMotion(DWORD, float, UINT, float) -> bool +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CActorInstance::InterceptLoopMotion(DWORD, float) -> bool +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CActorInstance::IsPushing() -> bool +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CActorInstance::IsUsingSkill() -> BOOL +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CActorInstance::CanCancelSkill() -> BOOL +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CActorInstance::UpdatePointInstance() -> void +{ + MT_PLATFORM_STUB(); +} + +auto CActorInstance::TestCollisionWithDynamicSphere(const CDynamicSphereInstance &) -> bool +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CActorInstance::UpdateAdvancingPointInstance() -> void +{ + MT_PLATFORM_STUB(); +} + +auto CActorInstance::AvoidObject(const CGraphicObjectInstance &) -> bool +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CActorInstance::IsBlockObject(const CGraphicObjectInstance &) -> bool +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CActorInstance::BlockMovement() -> void +{ + MT_PLATFORM_STUB(); +} + +auto CActorInstance::TestPhysicsBlendingCollision(CActorInstance &) -> BOOL +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CActorInstance::isAttacking() -> BOOL +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CActorInstance::IsUsingMovingSkill() -> BOOL +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CActorInstance::IsActEmotion() -> BOOL +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CActorInstance::SetBlendingPosition(const TPixelPosition &, float) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CActorInstance::SetBattleHitEffect(DWORD) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CActorInstance::GetMovementVectorRef() -> const D3DXVECTOR3 & +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CActorInstance::SetCurPixelPosition(const TPixelPosition &) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CActorInstance::NEW_SetSrcPixelPosition(const TPixelPosition &) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CActorInstance::NEW_SetDstPixelPosition(const TPixelPosition &) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CActorInstance::NEW_SetDstPixelPositionZ(float) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CActorInstance::NEW_GetCurPixelPositionRef() -> const TPixelPosition & +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CActorInstance::NEW_GetSrcPixelPositionRef() -> const TPixelPosition & +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CActorInstance::NEW_GetDstPixelPositionRef() -> const TPixelPosition & +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CActorInstance::NEW_GetLastPixelPositionRef() -> const TPixelPosition & +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CActorInstance::GetPixelPosition(TPixelPosition *) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CActorInstance::GetRotation() -> float +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CActorInstance::GetTargetRotation() -> float +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CActorInstance::GetAdvancingRotation() -> float +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CActorInstance::SetRotation(float) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CActorInstance::SetAdvancingRotation(float) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CActorInstance::RestoreRenderMode() -> void +{ + MT_PLATFORM_STUB(); +} + +auto CActorInstance::SetBlendRenderMode() -> void +{ + MT_PLATFORM_STUB(); +} + +auto CActorInstance::SetAlphaValue(float) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CActorInstance::GetAlphaValue() -> float +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CActorInstance::BlendAlphaValue(float, float) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CActorInstance::SetAddRenderMode() -> void +{ + MT_PLATFORM_STUB(); +} + +auto CActorInstance::SetAddColor(const D3DXCOLOR &) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CActorInstance::SetModulateRenderMode() -> void +{ + MT_PLATFORM_STUB(); +} + +auto CActorInstance::SetRenderMode(int) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CActorInstance::RenderTrace() -> void +{ + MT_PLATFORM_STUB(); +} + +auto CActorInstance::RenderCollisionData() -> void +{ + MT_PLATFORM_STUB(); +} + +auto CActorInstance::RenderToShadowMap() -> void +{ + MT_PLATFORM_STUB(); +} + +auto CActorInstance::UpdateAttribute() -> void +{ + MT_PLATFORM_STUB(); +} + +auto CActorInstance::CanFishing() -> bool +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CActorInstance::IsFishing() -> BOOL +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CActorInstance::OnGetFlyTargetPosition() -> D3DXVECTOR3 +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CActorInstance::OnShootDamage() -> void +{ + MT_PLATFORM_STUB(); +} + +auto CActorInstance::AddFlyTarget(const CFlyTarget &) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CActorInstance::SetFlyTarget(const CFlyTarget &) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CActorInstance::CanChangeTarget() -> bool +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CActorInstance::HORSE_MotionProcess(BOOL) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CActorInstance::MotionProcess(BOOL) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CActorInstance::RotationProcess() -> void +{ + MT_PLATFORM_STUB(); +} + +auto CActorInstance::ComboProcess() -> void +{ + MT_PLATFORM_STUB(); +} + +auto CActorInstance::ShakeProcess() -> void +{ + MT_PLATFORM_STUB(); +} + +auto CActorInstance::TraceProcess() -> void +{ + MT_PLATFORM_STUB(); +} + +auto CActorInstance::OnRender() -> void +{ + MT_PLATFORM_STUB(); +} + +auto CActorInstance::__ClearAttachingEffect() -> void +{ + MT_PLATFORM_STUB(); +} + +auto CActorInstance::__ClearCombo() -> void +{ + MT_PLATFORM_STUB(); +} + +auto CActorInstance::__ClearMotion() -> void +{ + MT_PLATFORM_STUB(); +} + +auto CActorInstance::__IsWaitMotion() -> bool +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CActorInstance::__IsMoveMotion() -> bool +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CActorInstance::__IsDamageMotion() -> bool +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CActorInstance::__IsKnockDownMotion() -> bool +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CActorInstance::__IsDieMotion() -> bool +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CActorInstance::__GetCurrentMotionIndex() -> WORD +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CActorInstance::__DestroyWeaponTrace() -> void +{ + MT_PLATFORM_STUB(); +} + +auto CActorInstance::__InitializePositionData() -> void +{ + MT_PLATFORM_STUB(); +} + +auto CActorInstance::__OnSyncing() -> void +{ + MT_PLATFORM_STUB(); +} + +auto CActorInstance::__OnWaiting() -> void +{ + MT_PLATFORM_STUB(); +} + +auto CActorInstance::__OnMoving() -> void +{ + MT_PLATFORM_STUB(); +} + +auto CActorInstance::EnableSkipCollision() -> void +{ + MT_PLATFORM_STUB(); +} + +auto CActorInstance::DisableSkipCollision() -> void +{ + MT_PLATFORM_STUB(); +} + +auto CActorInstance::__InitializeCollisionData() -> void +{ + MT_PLATFORM_STUB(); +} + +auto CActorInstance::__BlendAlpha_Initialize() -> void +{ + MT_PLATFORM_STUB(); +} + +auto CActorInstance::__BlendAlpha_Update() -> void +{ + MT_PLATFORM_STUB(); +} + +auto CActorInstance::__IsSyncing() -> bool +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CActorInstance::__OnStop() -> void +{ + MT_PLATFORM_STUB(); +} + +auto CActorInstance::TEMP_Push(int, int) -> void +{ + MT_PLATFORM_STUB(); +} diff --git a/extension/src/platform/pending/GameLib/FlyTarget.cpp b/extension/src/platform/pending/GameLib/FlyTarget.cpp new file mode 100644 index 00000000..3f579a25 --- /dev/null +++ b/extension/src/platform/pending/GameLib/FlyTarget.cpp @@ -0,0 +1,32 @@ +// Stand-in for the 40250 logic unit GameLib/FlyTarget.cpp, not ported yet: the members the ported units +// reference, as platform_stub.py stubs. Delete this file in the commit that ports the unit into port/ +// (docs/PORT-PLAN.md). +#include "GameLib/StdAfx.h" +#include "GameLib/FlyTarget.h" + +#include "../../PlatformStub.h" + +CFlyTarget::CFlyTarget(IFlyTargetableObject *) +{ + MT_PLATFORM_STUB(); +} + +CFlyTarget::CFlyTarget(const D3DXVECTOR3 &) +{ + MT_PLATFORM_STUB(); +} + +CFlyTarget::~CFlyTarget() +{ + MT_PLATFORM_STUB(); +} + +CFlyTarget::CFlyTarget() +{ + MT_PLATFORM_STUB(); +} + +auto CFlyTarget::NotifyTargetClear() -> void +{ + MT_PLATFORM_STUB(); +} diff --git a/extension/src/platform/pending/GameLib/ItemData.cpp b/extension/src/platform/pending/GameLib/ItemData.cpp new file mode 100644 index 00000000..92bec04e --- /dev/null +++ b/extension/src/platform/pending/GameLib/ItemData.cpp @@ -0,0 +1,61 @@ +// Stand-in for the 40250 logic unit GameLib/ItemData.cpp, not ported yet: the members the ported units +// reference, as platform_stub.py stubs. Delete this file in the commit that ports the unit into port/ +// (docs/PORT-PLAN.md). +#include "GameLib/StdAfx.h" +#include "GameLib/ItemData.h" + +#include "../../PlatformStub.h" + +auto CItemData::GetName() const -> const char * +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CItemData::GetType() const -> BYTE +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CItemData::GetValue(BYTE) const -> long +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CItemData::GetIndex() const -> DWORD +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CItemData::GetSubType() const -> BYTE +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CItemData::GetRefine() const -> UINT +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CItemData::GetWeaponType() const -> DWORD +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CItemData::GetSocketCount() const -> int +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CItemData::GetSpecularPowerf() const -> float +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} diff --git a/extension/src/platform/pending/GameLib/ItemManager.cpp b/extension/src/platform/pending/GameLib/ItemManager.cpp new file mode 100644 index 00000000..423fd2f0 --- /dev/null +++ b/extension/src/platform/pending/GameLib/ItemManager.cpp @@ -0,0 +1,23 @@ +// Stand-in for the 40250 logic unit GameLib/ItemManager.cpp, not ported yet: the members the ported units +// reference, as platform_stub.py stubs. Delete this file in the commit that ports the unit into port/ +// (docs/PORT-PLAN.md). +#include "GameLib/StdAfx.h" +#include "GameLib/ItemManager.h" + +#include "../../PlatformStub.h" + +CItemManager::CItemManager() +{ + MT_PLATFORM_STUB(); +} + +CItemManager::~CItemManager() +{ + MT_PLATFORM_STUB(); +} + +auto CItemManager::GetItemDataPointer(DWORD, CItemData **) -> BOOL +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} diff --git a/extension/src/platform/pending/GameLib/MapManager.cpp b/extension/src/platform/pending/GameLib/MapManager.cpp new file mode 100644 index 00000000..8041fa12 --- /dev/null +++ b/extension/src/platform/pending/GameLib/MapManager.cpp @@ -0,0 +1,70 @@ +// Stand-in for the 40250 logic unit GameLib/MapManager.cpp, not ported yet: the members the ported units +// reference, as platform_stub.py stubs. Delete this file in the commit that ports the unit into port/ +// (docs/PORT-PLAN.md). +#include "GameLib/StdAfx.h" +#include "GameLib/MapManager.h" + +#include "../../PlatformStub.h" + +auto CMapManager::GetHeight(float, float) -> float +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +CMapManager::CMapManager() +{ + MT_PLATFORM_STUB(); +} + +CMapManager::~CMapManager() +{ + MT_PLATFORM_STUB(); +} + +auto CMapManager::Clear() -> void +{ + MT_PLATFORM_STUB(); +} + +auto CMapManager::AllocMap() -> CMapBase * +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CMapManager::LoadMap(const std::string &, float, float, float) -> bool +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CMapManager::isPhysicalCollision(const D3DXVECTOR3 &) -> bool +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CMapManager::GetWaterHeight(int, int, long *) -> bool +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CMapManager::GetShadowMapColor(float, float) -> DWORD +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CMapManager::isAttrOn(float, float, BYTE) -> bool +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CMapManager::isAttrOn(int, int, BYTE) -> bool +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} diff --git a/extension/src/platform/pending/GameLib/MapType.cpp b/extension/src/platform/pending/GameLib/MapType.cpp new file mode 100644 index 00000000..90499467 --- /dev/null +++ b/extension/src/platform/pending/GameLib/MapType.cpp @@ -0,0 +1,11 @@ +// Pending MapType.cpp dependency of InstanceBase; the full unit is not ported yet. +#include "GameLib/StdAfx.h" +#include "GameLib/MapType.h" + +float SPixelPosition_CalculateDistanceSq3d(const TPixelPosition& left, const TPixelPosition& right) +{ + float dx = left.x - right.x; + float dy = left.y - right.y; + float dz = left.z - right.z; + return dx * dx + dy * dy + dz * dz; +} diff --git a/extension/src/platform/pending/GameLib/MapUtil.cpp b/extension/src/platform/pending/GameLib/MapUtil.cpp new file mode 100644 index 00000000..e02c8872 --- /dev/null +++ b/extension/src/platform/pending/GameLib/MapUtil.cpp @@ -0,0 +1,7 @@ +// Pending MapUtil.cpp dependency of the physics object. The interpolation unit remains 2V3 work. +#include "GameLib/StdAfx.h" +#include "GameLib/MapUtil.h" +#include "../../PlatformStub.h" + +CEaseOutInterpolation::CEaseOutInterpolation() { MT_PLATFORM_STUB(); } +CEaseOutInterpolation::~CEaseOutInterpolation() { MT_PLATFORM_STUB(); } diff --git a/extension/src/platform/pending/GameLib/PhysicsObject.cpp b/extension/src/platform/pending/GameLib/PhysicsObject.cpp new file mode 100644 index 00000000..6404628f --- /dev/null +++ b/extension/src/platform/pending/GameLib/PhysicsObject.cpp @@ -0,0 +1,43 @@ +// Stand-in for the 40250 logic unit GameLib/PhysicsObject.cpp, not ported yet: the members the ported units +// reference, as platform_stub.py stubs. Delete this file in the commit that ports the unit into port/ +// (docs/PORT-PLAN.md). +#include "GameLib/StdAfx.h" +#include "GameLib/PhysicsObject.h" + +#include "../../PlatformStub.h" + +decltype(IObjectManager::ms_ObjManager) IObjectManager::ms_ObjManager{}; + +decltype(IPhysicsWorld::ms_pWorld) IPhysicsWorld::ms_pWorld{}; + +CPhysicsObject::CPhysicsObject() +{ + MT_PLATFORM_STUB(); +} + +CPhysicsObject::~CPhysicsObject() +{ + MT_PLATFORM_STUB(); +} + +auto CPhysicsObject::Initialize() -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPhysicsObject::Update(float) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPhysicsObject::GetXMovement() -> float +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CPhysicsObject::GetYMovement() -> float +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} diff --git a/extension/src/platform/pending/GameLib/PropertyManager.cpp b/extension/src/platform/pending/GameLib/PropertyManager.cpp new file mode 100644 index 00000000..95a7bef1 --- /dev/null +++ b/extension/src/platform/pending/GameLib/PropertyManager.cpp @@ -0,0 +1,17 @@ +// Stand-in for the 40250 logic unit GameLib/PropertyManager.cpp, not ported yet: the members the ported units +// reference, as platform_stub.py stubs. Delete this file in the commit that ports the unit into port/ +// (docs/PORT-PLAN.md). +#include "GameLib/StdAfx.h" +#include "GameLib/PropertyManager.h" + +#include "../../PlatformStub.h" + +CPropertyManager::CPropertyManager() +{ + MT_PLATFORM_STUB(); +} + +CPropertyManager::~CPropertyManager() +{ + MT_PLATFORM_STUB(); +} diff --git a/extension/src/platform/pending/GameLib/RaceData.cpp b/extension/src/platform/pending/GameLib/RaceData.cpp new file mode 100644 index 00000000..35117c05 --- /dev/null +++ b/extension/src/platform/pending/GameLib/RaceData.cpp @@ -0,0 +1,13 @@ +// Stand-in for the 40250 logic unit GameLib/RaceData.cpp, not ported yet: the members the ported units +// reference, as platform_stub.py stubs. Delete this file in the commit that ports the unit into port/ +// (docs/PORT-PLAN.md). +#include "GameLib/StdAfx.h" +#include "GameLib/RaceData.h" + +#include "../../PlatformStub.h" + +auto CRaceData::GetNormalAttackIndex(WORD, WORD *) -> BOOL +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} diff --git a/extension/src/platform/pending/UserInterface/GameType.cpp b/extension/src/platform/pending/UserInterface/GameType.cpp new file mode 100644 index 00000000..89f7fbfa --- /dev/null +++ b/extension/src/platform/pending/UserInterface/GameType.cpp @@ -0,0 +1,10 @@ +// Pending GameType.cpp dependency of InstanceBase; the full unit is not ported yet. +#include "UserInterface/StdAfx.h" +#include "UserInterface/GameType.h" + +std::string g_strGuildSymbolPathName = "mark/10/"; + +const char* GetGuildSymbolFileName(DWORD dwGuildID) +{ + return _getf("%s%03d.jpg", g_strGuildSymbolPathName.c_str(), dwGuildID); +} diff --git a/extension/src/platform/pending/UserInterface/InstanceBase.cpp b/extension/src/platform/pending/UserInterface/InstanceBase.cpp new file mode 100644 index 00000000..362056d1 --- /dev/null +++ b/extension/src/platform/pending/UserInterface/InstanceBase.cpp @@ -0,0 +1,389 @@ +// Stand-in for the 40250 logic unit UserInterface/InstanceBase.cpp, not ported yet: the members the ported units +// reference, as platform_stub.py stubs. Delete this file in the commit that ports the unit into port/ +// (docs/PORT-PLAN.md). +#include "UserInterface/StdAfx.h" +#include "UserInterface/InstanceBase.h" + +#include "../../PlatformStub.h" + +auto CInstanceBase::RegisterEffect(UINT, const char *, const char *, bool) -> bool +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CInstanceBase::__AttachEffect(UINT) -> DWORD +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CInstanceBase::__DetachEffect(DWORD) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CInstanceBase::CreateSpecialEffect(DWORD) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CInstanceBase::AttachSpecialEffect(DWORD) -> void +{ + MT_PLATFORM_STUB(); +} + +decltype(CInstanceBase::ms_adwCRCAffectEffect) CInstanceBase::ms_adwCRCAffectEffect{}; + +decltype(CInstanceBase::ms_fDustGap) CInstanceBase::ms_fDustGap{}; + +decltype(CInstanceBase::ms_fHorseDustGap) CInstanceBase::ms_fHorseDustGap{}; + +auto CInstanceBase::DeleteBlendOut() -> void +{ + MT_PLATFORM_STUB(); +} + +auto CInstanceBase::AttachTextTail() -> void +{ + MT_PLATFORM_STUB(); +} + +auto CInstanceBase::DetachTextTail() -> void +{ + MT_PLATFORM_STUB(); +} + +auto CInstanceBase::UpdateTextTailLevel(DWORD) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CInstanceBase::RefreshTextTail() -> void +{ + MT_PLATFORM_STUB(); +} + +auto CInstanceBase::RefreshTextTailTitle() -> void +{ + MT_PLATFORM_STUB(); +} + +auto CInstanceBase::UpdateDeleting() -> bool +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CInstanceBase::ActDualEmotion(CInstanceBase &, WORD, WORD) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CInstanceBase::ActEmotion(DWORD) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CInstanceBase::LevelUp() -> void +{ + MT_PLATFORM_STUB(); +} + +auto CInstanceBase::SkillUp() -> void +{ + MT_PLATFORM_STUB(); +} + +auto CInstanceBase::Stun() -> void +{ + MT_PLATFORM_STUB(); +} + +auto CInstanceBase::Die() -> void +{ + MT_PLATFORM_STUB(); +} + +auto CInstanceBase::IsPVPInstance(CInstanceBase &) -> bool +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CInstanceBase::IsAffect(UINT) -> bool +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CInstanceBase::SetEventHandler(CActorInstance::IEventHandler *) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CInstanceBase::NEW_UseSkill(UINT, UINT, UINT, bool) -> bool +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CInstanceBase::NEW_GetDistanceFromDestPixelPosition(const TPixelPosition &) -> float +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CInstanceBase::NEW_GetDistanceFromDestInstance(CInstanceBase &) -> float +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CInstanceBase::NEW_SetPixelPosition(const TPixelPosition &) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CInstanceBase::RunNormalAttack(float) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CInstanceBase::RunComboAttack(float, DWORD) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CInstanceBase::CheckAdvancing() -> BOOL +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CInstanceBase::StartFishing(float) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CInstanceBase::StopFishing() -> void +{ + MT_PLATFORM_STUB(); +} + +auto CInstanceBase::ReactFishing() -> void +{ + MT_PLATFORM_STUB(); +} + +auto CInstanceBase::CatchSuccess() -> void +{ + MT_PLATFORM_STUB(); +} + +auto CInstanceBase::CatchFail() -> void +{ + MT_PLATFORM_STUB(); +} + +auto CInstanceBase::SCRIPT_SetPixelPosition(float, float) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CInstanceBase::NEW_GetPixelPosition(TPixelPosition *) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CInstanceBase::NEW_LookAtDestInstance(CInstanceBase &) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CInstanceBase::GetRotation() -> float +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CInstanceBase::GetAdvancingRotation() -> float +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CInstanceBase::SetRotation(float) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CInstanceBase::BlendRotation(float, float) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CInstanceBase::SetMotionMode(int) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CInstanceBase::PushOnceMotion(WORD, float, float) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CInstanceBase::__ClearAffects() -> void +{ + MT_PLATFORM_STUB(); +} + +auto CInstanceBase::SetAffectFlagContainer(const CAffectFlagContainer &) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CInstanceBase::SetEmoticon(UINT) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CInstanceBase::SetFishEmoticon() -> void +{ + MT_PLATFORM_STUB(); +} + +auto CInstanceBase::__EnableChangingTCPState() -> void +{ + MT_PLATFORM_STUB(); +} + +auto CInstanceBase::__ComboProcess() -> void +{ + MT_PLATFORM_STUB(); +} + +auto CInstanceBase::AttackProcess() -> void +{ + MT_PLATFORM_STUB(); +} + +auto CInstanceBase::__AttachSelectEffect() -> void +{ + MT_PLATFORM_STUB(); +} + +auto CInstanceBase::__DetachSelectEffect() -> void +{ + MT_PLATFORM_STUB(); +} + +auto CInstanceBase::__AttachTargetEffect() -> void +{ + MT_PLATFORM_STUB(); +} + +auto CInstanceBase::__DetachTargetEffect() -> void +{ + MT_PLATFORM_STUB(); +} + +auto CInstanceBase::__AttachEmpireEffect(DWORD) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CInstanceBase::__EffectContainer_Initialize() -> void +{ + MT_PLATFORM_STUB(); +} + +auto CInstanceBase::__EffectContainer_Destroy() -> void +{ + MT_PLATFORM_STUB(); +} + +auto CInstanceBase::__StoneSmoke_Inialize() -> void +{ + MT_PLATFORM_STUB(); +} + +auto CInstanceBase::__StoneSmoke_Destroy() -> void +{ + MT_PLATFORM_STUB(); +} + +auto CInstanceBase::ProcessDamage() -> void +{ + MT_PLATFORM_STUB(); +} + +auto CInstanceBase::AddDamageEffect(DWORD, BYTE, BOOL, BOOL) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CInstanceBase::ClearPVPKeySystem() -> void +{ + MT_PLATFORM_STUB(); +} + +auto CInstanceBase::InsertPVPKey(DWORD, DWORD) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CInstanceBase::RemovePVPKey(DWORD, DWORD) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CInstanceBase::InsertGVGKey(DWORD, DWORD) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CInstanceBase::RemoveGVGKey(DWORD, DWORD) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CInstanceBase::InsertDUELKey(DWORD, DWORD) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CInstanceBase::__FindDUELKey(DWORD, DWORD) -> bool +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CInstanceBase::GetEventHandlerRef() -> CActorInstance::IEventHandler & +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CInstanceBase::IsUsingSkill() -> BOOL +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CInstanceBase::isLock() -> BOOL +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CInstanceBase::__EffectContainer_AttachEffect(DWORD) -> DWORD +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CInstanceBase::__EffectContainer_DetachEffect(DWORD) -> void +{ + MT_PLATFORM_STUB(); +} diff --git a/extension/src/platform/pending/UserInterface/NetworkActorManager.cpp b/extension/src/platform/pending/UserInterface/NetworkActorManager.cpp deleted file mode 100644 index 653a4158..00000000 --- a/extension/src/platform/pending/UserInterface/NetworkActorManager.cpp +++ /dev/null @@ -1,177 +0,0 @@ -// Stand-in for the 40250 logic unit UserInterface/NetworkActorManager.cpp, not ported yet: the platform_stub.py skeleton of its -// header, so the units that call it (批次 2V1, the network slice) link. Delete this file in the commit -// that ports the unit into port/ (docs/PORT-PLAN.md 2V1). -#include "UserInterface/StdAfx.h" -#include "UserInterface/NetworkActorManager.h" -#include "UserInterface/PythonCharacterManager.h" // the __GetCharacterManager return type - -#include "../../PlatformStub.h" - -SNetworkActorData::SNetworkActorData() -{ - MT_PLATFORM_STUB(); -} - -auto SNetworkActorData::SetDstPosition(DWORD, LONG, LONG, DWORD) -> void -{ - MT_PLATFORM_STUB(); -} - -auto SNetworkActorData::SetPosition(LONG, LONG) -> void -{ - MT_PLATFORM_STUB(); -} - -auto SNetworkActorData::UpdatePosition() -> void -{ - MT_PLATFORM_STUB(); -} - -SNetworkActorData::SNetworkActorData(const SNetworkActorData &) -{ - MT_PLATFORM_STUB(); -} - -auto SNetworkActorData::operator=(const SNetworkActorData &) -> void -{ - MT_PLATFORM_STUB(); -} - -auto SNetworkActorData::__copy__(const SNetworkActorData &) -> void -{ - MT_PLATFORM_STUB(); -} - -CNetworkActorManager::CNetworkActorManager() -{ - MT_PLATFORM_STUB(); -} - -CNetworkActorManager::~CNetworkActorManager() -{ - MT_PLATFORM_STUB(); -} - -auto CNetworkActorManager::Destroy() -> void -{ - MT_PLATFORM_STUB(); -} - -auto CNetworkActorManager::SetMainActorVID(DWORD) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CNetworkActorManager::RemoveActor(DWORD) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CNetworkActorManager::AppendActor(const SNetworkActorData &) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CNetworkActorManager::UpdateActor(const SNetworkUpdateActorData &) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CNetworkActorManager::MoveActor(const SNetworkMoveActorData &) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CNetworkActorManager::SyncActor(DWORD, LONG, LONG) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CNetworkActorManager::SetActorOwner(DWORD, DWORD) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CNetworkActorManager::Update() -> void -{ - MT_PLATFORM_STUB(); -} - -auto CNetworkActorManager::__OLD_Update() -> void -{ - MT_PLATFORM_STUB(); -} - -auto CNetworkActorManager::__UpdateMainActor() -> void -{ - MT_PLATFORM_STUB(); -} - -auto CNetworkActorManager::__IsVisiblePos(LONG, LONG) -> bool -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CNetworkActorManager::__IsVisibleActor(const SNetworkActorData &) -> bool -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CNetworkActorManager::__IsMainActorVID(DWORD) -> bool -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CNetworkActorManager::__RemoveAllGroundItems() -> void -{ - MT_PLATFORM_STUB(); -} - -auto CNetworkActorManager::__RemoveAllActors() -> void -{ - MT_PLATFORM_STUB(); -} - -auto CNetworkActorManager::__RemoveDynamicActors() -> void -{ - MT_PLATFORM_STUB(); -} - -auto CNetworkActorManager::__RemoveCharacterManagerActor(SNetworkActorData &) -> void -{ - MT_PLATFORM_STUB(); -} - -auto CNetworkActorManager::__FindActorData(DWORD) -> SNetworkActorData * -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CNetworkActorManager::__AppendCharacterManagerActor(SNetworkActorData &) -> CInstanceBase * -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CNetworkActorManager::__FindActor(SNetworkActorData &) -> CInstanceBase * -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CNetworkActorManager::__FindActor(SNetworkActorData &, LONG, LONG) -> CInstanceBase * -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -auto CNetworkActorManager::__GetCharacterManager() -> CPythonCharacterManager & -{ - // PORT: the 40250 body (NetworkActorManager.cpp:310-313); a stub's default reference would construct a - // character manager. - return CPythonCharacterManager::Instance(); -} diff --git a/extension/src/platform/pending/UserInterface/PythonBackground.cpp b/extension/src/platform/pending/UserInterface/PythonBackground.cpp new file mode 100644 index 00000000..1497ecf4 --- /dev/null +++ b/extension/src/platform/pending/UserInterface/PythonBackground.cpp @@ -0,0 +1,90 @@ +// Stand-in for the 40250 logic unit UserInterface/PythonBackground.cpp, not ported yet: the members the ported units +// reference, as platform_stub.py stubs. Delete this file in the commit that ports the unit into port/ +// (docs/PORT-PLAN.md). +#include "UserInterface/StdAfx.h" +#include "UserInterface/PythonBackground.h" + +#include "../../PlatformStub.h" + +auto CPythonBackground::Destroy() -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonBackground::Create() -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonBackground::GlobalPositionToLocalPosition(LONG &, LONG &) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonBackground::LocalPositionToGlobalPosition(LONG &, LONG &) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonBackground::RefreshShadowLevel() -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonBackground::Update(float, float, float) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonBackground::ClearGuildArea() -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonBackground::RegisterGuildArea(int, int, int, int) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonBackground::CreateTargetEffect(DWORD, DWORD) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonBackground::CreateTargetEffect(DWORD, long, long) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonBackground::DeleteTargetEffect(DWORD) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonBackground::Warp(DWORD, DWORD) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonBackground::GetWarpMapName() -> const char * +{ + MT_PLATFORM_STUB(); + // PORT: Keep the not-yet-ported map lookup safe for GamePhase's ShowMapName call. + return ""; +} + +CPythonBackground::CPythonBackground() +{ + MT_PLATFORM_STUB(); +} + +CPythonBackground::~CPythonBackground() +{ + MT_PLATFORM_STUB(); +} + +auto CPythonBackground::CheckAdvancing(CInstanceBase *) -> bool +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} diff --git a/extension/src/platform/pending/UserInterface/PythonEventManager.cpp b/extension/src/platform/pending/UserInterface/PythonEventManager.cpp new file mode 100644 index 00000000..758f8c9e --- /dev/null +++ b/extension/src/platform/pending/UserInterface/PythonEventManager.cpp @@ -0,0 +1,28 @@ +// Stand-in for the 40250 logic unit UserInterface/PythonEventManager.cpp, not ported yet: the members the ported units +// reference, as platform_stub.py stubs. Delete this file in the commit that ports the unit into port/ +// (docs/PORT-PLAN.md). +#include "UserInterface/StdAfx.h" +#include "UserInterface/PythonEventManager.h" + +#include "../../PlatformStub.h" + +CPythonEventManager::CPythonEventManager() +{ + MT_PLATFORM_STUB(); +} + +CPythonEventManager::~CPythonEventManager() +{ + MT_PLATFORM_STUB(); +} + +auto CPythonEventManager::RegisterEventSetFromString(const std::string &) -> int +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CPythonEventManager::SetVisibleLineCount(int, int) -> void +{ + MT_PLATFORM_STUB(); +} diff --git a/extension/src/platform/pending/UserInterface/PythonExchange.cpp b/extension/src/platform/pending/UserInterface/PythonExchange.cpp new file mode 100644 index 00000000..40d1255b --- /dev/null +++ b/extension/src/platform/pending/UserInterface/PythonExchange.cpp @@ -0,0 +1,108 @@ +// Stand-in for the 40250 logic unit UserInterface/PythonExchange.cpp, not ported yet: the members the ported units +// reference, as platform_stub.py stubs. Delete this file in the commit that ports the unit into port/ +// (docs/PORT-PLAN.md). +#include "UserInterface/StdAfx.h" +#include "UserInterface/PythonExchange.h" + +#include "../../PlatformStub.h" + +CPythonExchange::CPythonExchange() +{ + MT_PLATFORM_STUB(); +} + +CPythonExchange::~CPythonExchange() +{ + MT_PLATFORM_STUB(); +} + +auto CPythonExchange::Clear() -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonExchange::Start() -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonExchange::End() -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonExchange::isTrading() -> bool +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CPythonExchange::SetSelfName(const char *) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonExchange::SetTargetName(const char *) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonExchange::SetElkToTarget(DWORD) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonExchange::SetElkToSelf(DWORD) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonExchange::SetItemToTarget(DWORD, DWORD, BYTE) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonExchange::SetItemToSelf(DWORD, DWORD, BYTE) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonExchange::SetItemMetinSocketToTarget(int, int, DWORD) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonExchange::SetItemMetinSocketToSelf(int, int, DWORD) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonExchange::SetItemAttributeToTarget(int, int, BYTE, short) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonExchange::SetItemAttributeToSelf(int, int, BYTE, short) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonExchange::DelItemOfTarget(BYTE) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonExchange::DelItemOfSelf(BYTE) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonExchange::SetAcceptToTarget(BYTE) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonExchange::SetAcceptToSelf(BYTE) -> void +{ + MT_PLATFORM_STUB(); +} diff --git a/extension/src/platform/pending/UserInterface/PythonGuild.cpp b/extension/src/platform/pending/UserInterface/PythonGuild.cpp index e41aaa1e..95a7b869 100644 --- a/extension/src/platform/pending/UserInterface/PythonGuild.cpp +++ b/extension/src/platform/pending/UserInterface/PythonGuild.cpp @@ -11,3 +11,123 @@ BOOL CPythonGuild::GetMemberDataPtrByName(const char *, TGuildMemberData **) MT_PLATFORM_STUB(); return FALSE; } + +auto CPythonGuild::Destroy() -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonGuild::EnableGuild() -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonGuild::SetGuildMoney(DWORD) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonGuild::SetGuildEXP(BYTE, DWORD) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonGuild::SetGradeData(BYTE, TGuildGradeData &) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonGuild::SetGradeName(BYTE, const char *) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonGuild::SetGradeAuthority(BYTE, BYTE) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonGuild::ClearComment() -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonGuild::RegisterComment(DWORD, const char *, const char *) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonGuild::RegisterMember(TGuildMemberData &) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonGuild::ChangeGuildMemberGrade(DWORD, BYTE) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonGuild::ChangeGuildMemberGeneralFlag(DWORD, BYTE) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonGuild::RemoveMember(DWORD) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonGuild::RegisterGuildName(DWORD, const char *) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonGuild::IsMainPlayer(DWORD) -> BOOL +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CPythonGuild::GetGuildInfoRef() -> TGuildInfo & +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CPythonGuild::GetMemberDataPtrByPID(DWORD, TGuildMemberData **) -> BOOL +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CPythonGuild::GetGuildSkillDataRef() -> TGuildSkillData & +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CPythonGuild::GetGuildName(DWORD, std::string *) -> bool +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CPythonGuild::StartGuildWar(DWORD) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonGuild::EndGuildWar(DWORD) -> void +{ + MT_PLATFORM_STUB(); +} + +CPythonGuild::CPythonGuild() +{ + MT_PLATFORM_STUB(); +} + +CPythonGuild::~CPythonGuild() +{ + MT_PLATFORM_STUB(); +} diff --git a/extension/src/platform/pending/UserInterface/PythonItem.cpp b/extension/src/platform/pending/UserInterface/PythonItem.cpp new file mode 100644 index 00000000..e2fd6def --- /dev/null +++ b/extension/src/platform/pending/UserInterface/PythonItem.cpp @@ -0,0 +1,57 @@ +// Stand-in for the 40250 logic unit UserInterface/PythonItem.cpp, not ported yet: the members the ported units +// reference, as platform_stub.py stubs. Delete this file in the commit that ports the unit into port/ +// (docs/PORT-PLAN.md). +#include "UserInterface/StdAfx.h" +#include "UserInterface/PythonItem.h" + +#include "../../PlatformStub.h" + +CPythonItem::CPythonItem() +{ + MT_PLATFORM_STUB(); +} + +CPythonItem::~CPythonItem() +{ + MT_PLATFORM_STUB(); +} + +auto CPythonItem::Destroy() -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonItem::PlayUseSound(DWORD) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonItem::PlayDropSound(DWORD) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonItem::PlayUsePotionSound() -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonItem::CreateItem(DWORD, DWORD, float, float, float, bool) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonItem::DeleteItem(DWORD) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonItem::DeleteAllItems() -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonItem::SetOwnership(DWORD, const char *) -> void +{ + MT_PLATFORM_STUB(); +} diff --git a/extension/src/platform/pending/UserInterface/PythonMessenger.cpp b/extension/src/platform/pending/UserInterface/PythonMessenger.cpp new file mode 100644 index 00000000..b91d7ab1 --- /dev/null +++ b/extension/src/platform/pending/UserInterface/PythonMessenger.cpp @@ -0,0 +1,57 @@ +// Stand-in for the 40250 logic unit UserInterface/PythonMessenger.cpp, not ported yet: the members the ported units +// reference, as platform_stub.py stubs. Delete this file in the commit that ports the unit into port/ +// (docs/PORT-PLAN.md). +#include "UserInterface/StdAfx.h" +#include "UserInterface/PythonMessenger.h" + +#include "../../PlatformStub.h" + +CPythonMessenger::CPythonMessenger() +{ + MT_PLATFORM_STUB(); +} + +CPythonMessenger::~CPythonMessenger() +{ + MT_PLATFORM_STUB(); +} + +auto CPythonMessenger::OnFriendLogin(const char *) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonMessenger::OnFriendLogout(const char *) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonMessenger::SetMobile(const char *, BYTE) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonMessenger::AppendGuildMember(const char *) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonMessenger::RemoveGuildMember(const char *) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonMessenger::RemoveAllGuildMember() -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonMessenger::LoginGuildMember(const char *) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonMessenger::LogoutGuildMember(const char *) -> void +{ + MT_PLATFORM_STUB(); +} diff --git a/extension/src/platform/pending/UserInterface/PythonMiniMap.cpp b/extension/src/platform/pending/UserInterface/PythonMiniMap.cpp new file mode 100644 index 00000000..8c7aadd6 --- /dev/null +++ b/extension/src/platform/pending/UserInterface/PythonMiniMap.cpp @@ -0,0 +1,72 @@ +// Stand-in for the 40250 logic unit UserInterface/PythonMiniMap.cpp, not ported yet: the members the ported units +// reference, as platform_stub.py stubs. Delete this file in the commit that ports the unit into port/ +// (docs/PORT-PLAN.md). +#include "UserInterface/StdAfx.h" +#include "UserInterface/PythonMiniMap.h" + +#include "../../PlatformStub.h" + +CPythonMiniMap::CPythonMiniMap() +{ + MT_PLATFORM_STUB(); +} + +CPythonMiniMap::~CPythonMiniMap() +{ + MT_PLATFORM_STUB(); +} + +auto CPythonMiniMap::AddObserver(DWORD, float, float) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonMiniMap::MoveObserver(DWORD, float, float) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonMiniMap::RemoveObserver(DWORD) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonMiniMap::ClearAtlasMarkInfo() -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonMiniMap::RegisterAtlasMark(BYTE, const char *, long, long) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonMiniMap::ClearGuildArea() -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonMiniMap::RegisterGuildArea(DWORD, DWORD, long, long, long, long) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonMiniMap::CreateTarget(int, const char *) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonMiniMap::CreateTarget(int, const char *, DWORD) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonMiniMap::UpdateTarget(int, int, int) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonMiniMap::DeleteTarget(int) -> void +{ + MT_PLATFORM_STUB(); +} diff --git a/extension/src/platform/pending/UserInterface/PythonNetworkStreamPhaseGame.cpp b/extension/src/platform/pending/UserInterface/PythonNetworkStreamPhaseGame.cpp deleted file mode 100644 index 570ff88f..00000000 --- a/extension/src/platform/pending/UserInterface/PythonNetworkStreamPhaseGame.cpp +++ /dev/null @@ -1,335 +0,0 @@ -// Stand-in for the 40250 logic unit UserInterface/PythonNetworkStreamPhaseGame.cpp, not ported yet: the CPythonNetworkStream -// members it defines that the ported network slice (批次 2V1) references, as MT_PLATFORM_STUB()s. Delete this -// file in the commit that ports the unit into port/ (docs/PORT-PLAN.md 2V1). -#include "UserInterface/StdAfx.h" -#include "UserInterface/PythonNetworkStream.h" -#include "EterBase/Filename.h" - -#include "../../PlatformStub.h" - -BOOL gs_bEmpireLanuageEnable = TRUE; - -void CPythonNetworkStream::GamePhase() -{ - MT_PLATFORM_STUB(); -} - -// PORT: consumes the packet only, so the loading phase keeps reading; the handler body comes with the unit. -bool CPythonNetworkStream::RecvPointChange() -{ - MT_PLATFORM_STUB(); - TPacketGCPointChange PointChange; - return Recv(sizeof(PointChange), &PointChange); -} - -void CPythonNetworkStream::RegisterEmoticonString(const char *) -{ - MT_PLATFORM_STUB(); -} - -bool CPythonNetworkStream::SendAnswerMakeGuildPacket(const char *) -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -bool CPythonNetworkStream::SendCharacterPositionPacket(BYTE) -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -bool CPythonNetworkStream::SendChatPacket(const char *, BYTE) -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -// PORT: the 40250 body verbatim ahead of its unit: the loading phase sends it on the main-character packet. -bool CPythonNetworkStream::SendClientVersionPacket() -{ - std::string filename; - - GetExcutedFileName(filename); - - filename = CFileNameHelper::NoPath(filename); - CFileNameHelper::ChangeDosPath(filename); - - if (LocaleService_IsEUROPE() && false == LocaleService_IsYMIR()) - { - TPacketCGClientVersion2 kVersionPacket; - kVersionPacket.header = HEADER_CG_CLIENT_VERSION2; - strncpy(kVersionPacket.filename, filename.c_str(), sizeof(kVersionPacket.filename)-1); - strncpy(kVersionPacket.timestamp, "1215955205", sizeof(kVersionPacket.timestamp)-1); // # python time.time 앞자리 - //strncpy(kVersionPacket.timestamp, __TIMESTAMP__, sizeof(kVersionPacket.timestamp)-1); // old_string_ver - //strncpy(kVersionPacket.timestamp, "1218055205", sizeof(kVersionPacket.timestamp)-1); // new_future - //strncpy(kVersionPacket.timestamp, "1214055205", sizeof(kVersionPacket.timestamp)-1); // old_past - - if (!Send(sizeof(kVersionPacket), &kVersionPacket)) - Tracef("SendClientReportPacket Error"); - } - else - { - TPacketCGClientVersion kVersionPacket; - kVersionPacket.header = HEADER_CG_CLIENT_VERSION; - strncpy(kVersionPacket.filename, filename.c_str(), sizeof(kVersionPacket.filename)-1); - strncpy(kVersionPacket.timestamp, __TIMESTAMP__, sizeof(kVersionPacket.timestamp)-1); - - if (!Send(sizeof(kVersionPacket), &kVersionPacket)) - Tracef("SendClientReportPacket Error"); - } - return SendSequence(); -} - -bool CPythonNetworkStream::SendExchangeAcceptPacket() -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -bool CPythonNetworkStream::SendExchangeElkAddPacket(DWORD) -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -bool CPythonNetworkStream::SendExchangeExitPacket() -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -bool CPythonNetworkStream::SendExchangeItemAddPacket(TItemPos, BYTE) -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -bool CPythonNetworkStream::SendExchangeItemDelPacket(BYTE) -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -bool CPythonNetworkStream::SendExchangeStartPacket(DWORD) -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -bool CPythonNetworkStream::SendGiveItemPacket(DWORD, TItemPos, int) -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -bool CPythonNetworkStream::SendGuildAddMemberPacket(DWORD) -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -bool CPythonNetworkStream::SendGuildChangeGradeAuthorityPacket(BYTE, BYTE) -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -bool CPythonNetworkStream::SendGuildChangeGradeNamePacket(BYTE, const char *) -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -bool CPythonNetworkStream::SendGuildChangeMemberGeneralPacket(DWORD, BYTE) -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -bool CPythonNetworkStream::SendGuildChangeMemberGradePacket(DWORD, BYTE) -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -bool CPythonNetworkStream::SendGuildChargeGSPPacket(DWORD) -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -bool CPythonNetworkStream::SendGuildDeleteCommentPacket(DWORD) -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -bool CPythonNetworkStream::SendGuildDepositMoneyPacket(DWORD) -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -bool CPythonNetworkStream::SendGuildInviteAnswerPacket(DWORD, BYTE) -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -bool CPythonNetworkStream::SendGuildOfferPacket(DWORD) -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -bool CPythonNetworkStream::SendGuildPostCommentPacket(const char *) -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -bool CPythonNetworkStream::SendGuildRefreshCommentsPacket(DWORD) -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -bool CPythonNetworkStream::SendGuildRemoveMemberPacket(DWORD) -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -bool CPythonNetworkStream::SendGuildUseSkillPacket(DWORD, DWORD) -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -bool CPythonNetworkStream::SendGuildWithdrawMoneyPacket(DWORD) -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -bool CPythonNetworkStream::SendMessengerAddByNamePacket(const char *) -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -bool CPythonNetworkStream::SendMessengerAddByVIDPacket(DWORD) -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -bool CPythonNetworkStream::SendMessengerRemovePacket(const char *, const char *) -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -bool CPythonNetworkStream::SendMobileMessagePacket(const char *, const char *) -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -bool CPythonNetworkStream::SendOnClickPacket(DWORD) -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -bool CPythonNetworkStream::SendPartyInviteAnswerPacket(DWORD, BYTE) -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -bool CPythonNetworkStream::SendPartyInvitePacket(DWORD) -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -bool CPythonNetworkStream::SendPartyParameterPacket(BYTE) -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -bool CPythonNetworkStream::SendPartyRemovePacket(DWORD) -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -bool CPythonNetworkStream::SendPartySetStatePacket(DWORD, BYTE, BYTE) -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -bool CPythonNetworkStream::SendPartyUseSkillPacket(BYTE, DWORD) -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -bool CPythonNetworkStream::SendQuestConfirmPacket(BYTE, DWORD) -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -bool CPythonNetworkStream::SendQuestInputStringPacket(const char *) -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -bool CPythonNetworkStream::SendRefinePacket(BYTE, BYTE) -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -bool CPythonNetworkStream::SendSelectItemPacket(DWORD) -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -bool CPythonNetworkStream::SendWhisperPacket(const char *, const char *) -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -void CPythonNetworkStream::SetGamePhase() -{ - MT_PLATFORM_STUB(); -} - -void CPythonNetworkStream::ToggleGameDebugInfo() -{ - MT_PLATFORM_STUB(); -} - -void CPythonNetworkStream::Warp(LONG, LONG) -{ - MT_PLATFORM_STUB(); -} - -void CPythonNetworkStream::__InitializeGamePhase() -{ - MT_PLATFORM_STUB(); -} - -void CPythonNetworkStream::__TEST_SetSkillGroupFake(int) -{ - MT_PLATFORM_STUB(); -} diff --git a/extension/src/platform/pending/UserInterface/PythonNetworkStreamPhaseGameActor.cpp b/extension/src/platform/pending/UserInterface/PythonNetworkStreamPhaseGameActor.cpp deleted file mode 100644 index 7c9cbc1a..00000000 --- a/extension/src/platform/pending/UserInterface/PythonNetworkStreamPhaseGameActor.cpp +++ /dev/null @@ -1,15 +0,0 @@ -// Stand-in for the 40250 logic unit UserInterface/PythonNetworkStreamPhaseGameActor.cpp, not ported yet: the CPythonNetworkStream -// members it defines that the ported network slice (批次 2V1) references, as MT_PLATFORM_STUB()s. Delete this -// file in the commit that ports the unit into port/ (docs/PORT-PLAN.md 2V1). -#include "UserInterface/StdAfx.h" -#include "UserInterface/PythonNetworkStream.h" - -#include "../../PlatformStub.h" - -// PORT: consumes the packet only, so the loading phase keeps reading; the handler body comes with the unit. -bool CPythonNetworkStream::RecvCharacterUpdatePacket() -{ - MT_PLATFORM_STUB(); - TPacketGCCharacterUpdate chrUpdatePacket; - return Recv(sizeof(chrUpdatePacket), &chrUpdatePacket); -} diff --git a/extension/src/platform/pending/UserInterface/PythonNetworkStreamPhaseGameItem.cpp b/extension/src/platform/pending/UserInterface/PythonNetworkStreamPhaseGameItem.cpp deleted file mode 100644 index 454e051e..00000000 --- a/extension/src/platform/pending/UserInterface/PythonNetworkStreamPhaseGameItem.cpp +++ /dev/null @@ -1,113 +0,0 @@ -// Stand-in for the 40250 logic unit UserInterface/PythonNetworkStreamPhaseGameItem.cpp, not ported yet: the CPythonNetworkStream -// members it defines that the ported network slice (批次 2V1) references, as MT_PLATFORM_STUB()s. Delete this -// file in the commit that ports the unit into port/ (docs/PORT-PLAN.md 2V1). -#include "UserInterface/StdAfx.h" -#include "UserInterface/PythonNetworkStream.h" - -#include "../../PlatformStub.h" - -// PORT: consumes the packet only, so the loading phase keeps reading; the handler body comes with the unit. -bool CPythonNetworkStream::RecvItemSetPacket() -{ - MT_PLATFORM_STUB(); - TPacketGCItemSet packet_item_set; - return Recv(sizeof(packet_item_set), &packet_item_set); -} - -// PORT: consumes the packet only, so the loading phase keeps reading; the handler body comes with the unit. -bool CPythonNetworkStream::RecvQuickSlotAddPacket() -{ - MT_PLATFORM_STUB(); - TPacketGCQuickSlotAdd packet_quick_slot_add; - return Recv(sizeof(packet_quick_slot_add), &packet_quick_slot_add); -} - -bool CPythonNetworkStream::SendItemDropPacket(TItemPos, DWORD) -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -bool CPythonNetworkStream::SendItemDropPacketNew(TItemPos, DWORD, DWORD) -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -bool CPythonNetworkStream::SendItemMovePacket(TItemPos, TItemPos, BYTE) -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -bool CPythonNetworkStream::SendItemPickUpPacket(DWORD) -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -bool CPythonNetworkStream::SendItemUsePacket(TItemPos) -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -bool CPythonNetworkStream::SendItemUseToItemPacket(TItemPos, TItemPos) -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -bool CPythonNetworkStream::SendMallCheckoutPacket(BYTE, TItemPos) -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -bool CPythonNetworkStream::SendSafeBoxCheckinPacket(TItemPos, BYTE) -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -bool CPythonNetworkStream::SendSafeBoxCheckoutPacket(BYTE, TItemPos) -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -bool CPythonNetworkStream::SendSafeBoxItemMovePacket(BYTE, BYTE, BYTE) -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -bool CPythonNetworkStream::SendSafeBoxMoneyPacket(BYTE, DWORD) -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -bool CPythonNetworkStream::SendShopBuyPacket(BYTE) -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -bool CPythonNetworkStream::SendShopEndPacket() -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -bool CPythonNetworkStream::SendShopSellPacket(BYTE) -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} - -bool CPythonNetworkStream::SendShopSellPacketNew(BYTE, BYTE) -{ - MT_PLATFORM_STUB(); - return mt_platform_stub_return(); -} diff --git a/extension/src/platform/pending/UserInterface/PythonNonPlayer.cpp b/extension/src/platform/pending/UserInterface/PythonNonPlayer.cpp new file mode 100644 index 00000000..e2063b75 --- /dev/null +++ b/extension/src/platform/pending/UserInterface/PythonNonPlayer.cpp @@ -0,0 +1,41 @@ +// Stand-in for the 40250 logic unit UserInterface/PythonNonPlayer.cpp, not ported yet: the members the ported units +// reference, as platform_stub.py stubs. Delete this file in the commit that ports the unit into port/ +// (docs/PORT-PLAN.md). +#include "UserInterface/StdAfx.h" +#include "UserInterface/PythonNonPlayer.h" + +#include "../../PlatformStub.h" + +CPythonNonPlayer::CPythonNonPlayer() +{ + MT_PLATFORM_STUB(); +} + +CPythonNonPlayer::~CPythonNonPlayer() +{ + MT_PLATFORM_STUB(); +} + +auto CPythonNonPlayer::GetName(DWORD, const char **) -> bool +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CPythonNonPlayer::GetInstanceType(DWORD, BYTE *) -> bool +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CPythonNonPlayer::GetEventType(DWORD) -> BYTE +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CPythonNonPlayer::GetMonsterColor(DWORD) -> DWORD +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} diff --git a/extension/src/platform/pending/UserInterface/PythonQuest.cpp b/extension/src/platform/pending/UserInterface/PythonQuest.cpp new file mode 100644 index 00000000..b8071644 --- /dev/null +++ b/extension/src/platform/pending/UserInterface/PythonQuest.cpp @@ -0,0 +1,68 @@ +// Stand-in for the 40250 logic unit UserInterface/PythonQuest.cpp, not ported yet: the members the ported units +// reference, as platform_stub.py stubs. Delete this file in the commit that ports the unit into port/ +// (docs/PORT-PLAN.md). +#include "UserInterface/StdAfx.h" +#include "UserInterface/PythonQuest.h" + +#include "../../PlatformStub.h" + +CPythonQuest::CPythonQuest() +{ + MT_PLATFORM_STUB(); +} + +CPythonQuest::~CPythonQuest() +{ + MT_PLATFORM_STUB(); +} + +auto CPythonQuest::RegisterQuestInstance(const SQuestInstance &) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonQuest::DeleteQuestInstance(DWORD) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonQuest::IsQuest(DWORD) -> bool +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CPythonQuest::MakeQuest(DWORD) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonQuest::SetQuestTitle(DWORD, const char *) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonQuest::SetQuestClockName(DWORD, const char *) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonQuest::SetQuestCounterName(DWORD, const char *) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonQuest::SetQuestClockValue(DWORD, int) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonQuest::SetQuestCounterValue(DWORD, int) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonQuest::SetQuestIconFileName(DWORD, const char *) -> void +{ + MT_PLATFORM_STUB(); +} diff --git a/extension/src/platform/pending/UserInterface/PythonSafeBox.cpp b/extension/src/platform/pending/UserInterface/PythonSafeBox.cpp new file mode 100644 index 00000000..1e0095aa --- /dev/null +++ b/extension/src/platform/pending/UserInterface/PythonSafeBox.cpp @@ -0,0 +1,64 @@ +// Stand-in for the 40250 logic unit UserInterface/PythonSafeBox.cpp, not ported yet: the members the ported units +// reference, as platform_stub.py stubs. Delete this file in the commit that ports the unit into port/ +// (docs/PORT-PLAN.md). +#include "UserInterface/StdAfx.h" +#include "UserInterface/PythonSafeBox.h" + +#include "../../PlatformStub.h" + +CPythonSafeBox::CPythonSafeBox() +{ + MT_PLATFORM_STUB(); +} + +CPythonSafeBox::~CPythonSafeBox() +{ + MT_PLATFORM_STUB(); +} + +auto CPythonSafeBox::OpenSafeBox(int) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonSafeBox::SetItemData(DWORD, const TItemData &) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonSafeBox::DelItemData(DWORD) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonSafeBox::SetMoney(DWORD) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonSafeBox::GetSlotItemID(DWORD, DWORD *) -> BOOL +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} + +auto CPythonSafeBox::OpenMall(int) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonSafeBox::SetMallItemData(DWORD, const TItemData &) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonSafeBox::DelMallItemData(DWORD) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonSafeBox::GetSlotMallItemID(DWORD, DWORD *) -> BOOL +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} diff --git a/extension/src/platform/pending/UserInterface/PythonShop.cpp b/extension/src/platform/pending/UserInterface/PythonShop.cpp new file mode 100644 index 00000000..8213862a --- /dev/null +++ b/extension/src/platform/pending/UserInterface/PythonShop.cpp @@ -0,0 +1,48 @@ +// Stand-in for the 40250 logic unit UserInterface/PythonShop.cpp, not ported yet: the members the ported units +// reference, as platform_stub.py stubs. Delete this file in the commit that ports the unit into port/ +// (docs/PORT-PLAN.md). +#include "UserInterface/StdAfx.h" +#include "UserInterface/PythonShop.h" + +#include "../../PlatformStub.h" + +CPythonShop::CPythonShop() +{ + MT_PLATFORM_STUB(); +} + +CPythonShop::~CPythonShop() +{ + MT_PLATFORM_STUB(); +} + +auto CPythonShop::Clear() -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonShop::SetItemData(DWORD, const TShopItemData &) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonShop::SetItemData(BYTE, DWORD, const TShopItemData &) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonShop::SetTabCoinType(BYTE, BYTE) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonShop::SetTabName(BYTE, const char *) -> void +{ + MT_PLATFORM_STUB(); +} + +auto CPythonShop::IsOpen() -> BOOL +{ + MT_PLATFORM_STUB(); + return mt_platform_stub_return(); +} diff --git a/extension/src/platform/pending/UserInterface/PythonTextTail.cpp b/extension/src/platform/pending/UserInterface/PythonTextTail.cpp new file mode 100644 index 00000000..76f27332 --- /dev/null +++ b/extension/src/platform/pending/UserInterface/PythonTextTail.cpp @@ -0,0 +1,22 @@ +// Stand-in for the 40250 logic unit UserInterface/PythonTextTail.cpp, not ported yet: the members the ported units +// reference, as platform_stub.py stubs. Delete this file in the commit that ports the unit into port/ +// (docs/PORT-PLAN.md). +#include "UserInterface/StdAfx.h" +#include "UserInterface/PythonTextTail.h" + +#include "../../PlatformStub.h" + +CPythonTextTail::CPythonTextTail() +{ + MT_PLATFORM_STUB(); +} + +CPythonTextTail::~CPythonTextTail() +{ + MT_PLATFORM_STUB(); +} + +auto CPythonTextTail::RegisterChatTail(DWORD, const char *) -> void +{ + MT_PLATFORM_STUB(); +} diff --git a/extension/src/port/GameLib/ActorInstance.cpp b/extension/src/port/GameLib/ActorInstance.cpp new file mode 100644 index 00000000..bd66f0d9 --- /dev/null +++ b/extension/src/port/GameLib/ActorInstance.cpp @@ -0,0 +1,979 @@ +#include "StdAfx.h" +#include "ActorInstance.h" +#include "AreaTerrain.h" +#include "RaceData.h" +#include "../SpeedTreeLib/SpeedTreeForestDirectX8.h" +#include "../SpeedTreeLib/SpeedTreeWrapper.h" + +enum +{ + MAIN_RACE_MAX_NUM = 8, +}; + +void CActorInstance::INSTANCEBASE_Deform() +{ + Deform(); + TraceProcess(); +} + +void CActorInstance::INSTANCEBASE_Transform() +{ + if (m_pkHorse) + { + m_pkHorse->INSTANCEBASE_Transform(); + + m_x = m_pkHorse->NEW_GetCurPixelPositionRef().x; + m_y = -m_pkHorse->NEW_GetCurPixelPositionRef().y; + m_z = m_pkHorse->NEW_GetCurPixelPositionRef().z; + m_bNeedUpdateCollision = TRUE; + } + + //DWORD t2=ELTimer_GetMSec(); + Update(); + //DWORD t3=ELTimer_GetMSec(); + TransformProcess(); + //DWORD t4=ELTimer_GetMSec(); + Transform(); + //DWORD t5=ELTimer_GetMSec(); + UpdatePointInstance(); + //DWORD t6=ELTimer_GetMSec(); + ShakeProcess(); + //DWORD t7=ELTimer_GetMSec(); + UpdateBoundingSphere(); + //DWORD t8=ELTimer_GetMSec(); + UpdateAttribute(); +} + +/* +void CActorInstance::TEMP_Update() +{ + //DWORD t1=ELTimer_GetMSec(); + OnUpdate(); + //DWORD t2=ELTimer_GetMSec(); + UpdateBoundingSphere(); + //DWORD t3=ELTimer_GetMSec(); + +#ifdef __PERFORMANCE_CHECKER__ + { + static FILE* fp=fopen("perf_actor_update.txt", "w"); + + if (t3-t1>3) + { + fprintf(fp, "AIU.Total %d (Time %f)\n", + t3-t1, ELTimer_GetMSec()/1000.0f); + fprintf(fp, "AIU.UP %d\n", t2-t1); + fprintf(fp, "AIU.UBS %d\n", t3-t2); + fprintf(fp, "-------------------------------- \n"); + fflush(fp); + } + fflush(fp); + } +#endif +} +*/ + +void CActorInstance::OnUpdate() +{ +#ifdef __PERFORMANCE_CHECKER__ + DWORD t1=ELTimer_GetMSec(); +#endif + if (!IsParalysis()) + CGraphicThingInstance::OnUpdate(); +#ifdef __PERFORMANCE_CHECKER__ + DWORD t2=ELTimer_GetMSec(); +#endif + + UpdateAttachingInstances(); + +#ifdef __PERFORMANCE_CHECKER__ + DWORD t3=ELTimer_GetMSec(); +#endif + + __BlendAlpha_Update(); + +#ifdef __PERFORMANCE_CHECKER__ + DWORD t4=ELTimer_GetMSec(); + { + static FILE* fp=fopen("perf_actor_update2.txt", "w"); + + if (t4-t1>3) + { + fprintf(fp, "AIU2.Total %d (Time %f)\n", + t4-t1, ELTimer_GetMSec()/1000.0f); + fprintf(fp, "AIU2.GU %d\n", t2-t1); + fprintf(fp, "AIU2.UAI %d\n", t3-t2); + fprintf(fp, "AIU2.BAU %d\n", t4-t3); + fprintf(fp, "-------------------------------- \n"); + fflush(fp); + } + fflush(fp); + } +#endif +} + + +// 2004.07.05.myevan. 궁신탄영 맵에 끼이는 문제해결 +IBackground& CActorInstance::GetBackground() +{ + return IBackground::Instance(); +} + + +void CActorInstance::SetMainInstance() +{ + m_isMain=true; +} + +void CActorInstance::SetParalysis(bool isParalysis) +{ + m_isParalysis=isParalysis; +} + +void CActorInstance::SetFaint(bool isFaint) +{ + m_isFaint=isFaint; +} + +void CActorInstance::SetSleep(bool isSleep) +{ + m_isSleep=isSleep; + + Stop(); +} + +void CActorInstance::SetResistFallen(bool isResistFallen) +{ + m_isResistFallen=isResistFallen; +} + +void CActorInstance::SetReachScale(float fScale) +{ + m_fReachScale=fScale; +} + +float CActorInstance::__GetReachScale() +{ + return m_fReachScale; +} + +float CActorInstance::__GetAttackSpeed() +{ + return m_fAtkSpd; +} + +WORD CActorInstance::__GetCurrentComboType() +{ + if (IsBowMode()) + return 0; + if (IsHandMode()) + return 0; + if (__IsMountingHorse()) + return 0; + + return m_wcurComboType; +} + +void CActorInstance::SetComboType(WORD wComboType) +{ + m_wcurComboType = wComboType; +} + +void CActorInstance::SetAttackSpeed(float fAtkSpd) +{ + m_fAtkSpd=fAtkSpd; +} + +void CActorInstance::SetMoveSpeed(float fMovSpd) +{ + if (m_fMovSpd==fMovSpd) + return; + + m_fMovSpd=fMovSpd; + + if (__IsMoveMotion()) + { + Stop(); + Move(); + } +} + +void CActorInstance::SetFishingPosition(D3DXVECTOR3 & rv3Position) +{ + m_v3FishingPosition = rv3Position; +} + +// ActorInstanceMotion.cpp 에 넣도록 하자 +void CActorInstance::Move() +{ + if (m_isWalking) + { + SetLoopMotion(CRaceMotionData::NAME_WALK, 0.15f, m_fMovSpd); + } + else + { + SetLoopMotion(CRaceMotionData::NAME_RUN, 0.15f, m_fMovSpd); + } +} + +void CActorInstance::Stop(float fBlendingTime) +{ + __ClearMotion(); + SetLoopMotion(CRaceMotionData::NAME_WAIT, fBlendingTime); +} + +void CActorInstance::SetOwner(DWORD dwOwnerVID) +{ + m_fOwnerBaseTime=GetLocalTime(); + m_dwOwnerVID=dwOwnerVID; +} + +void CActorInstance::SetActorType(UINT eType) +{ + m_eActorType=eType; +} + +UINT CActorInstance::GetActorType() const +{ + return m_eActorType; +} + +bool CActorInstance::IsHandMode() +{ + if (CRaceMotionData::MODE_GENERAL==GetMotionMode()) + return true; + + if (CRaceMotionData::MODE_HORSE==GetMotionMode()) + return true; + + return false; +} + +bool CActorInstance::IsTwoHandMode() +{ + if (CRaceMotionData::MODE_TWOHAND_SWORD==GetMotionMode()) + return true; + + return false; +} + +bool CActorInstance::IsBowMode() +{ + if (CRaceMotionData::MODE_BOW==GetMotionMode()) + return true; + + if (CRaceMotionData::MODE_HORSE_BOW==GetMotionMode()) + return true; + + return false; +} + +bool CActorInstance::IsPoly() +{ + if (TYPE_POLY==m_eActorType) + return true; + + if (TYPE_PC==m_eActorType) + if (m_eRace >= MAIN_RACE_MAX_NUM) + return TRUE; + + return false; +} + +bool CActorInstance::IsPC() +{ + if (TYPE_PC==m_eActorType) + return true; + + return false; +} + +bool CActorInstance::IsNPC() +{ + if (TYPE_NPC==m_eActorType) + return true; + + return false; +} + +bool CActorInstance::IsEnemy() +{ + if (TYPE_ENEMY==m_eActorType) + return true; + + return false; +} + +bool CActorInstance::IsStone() +{ + if (TYPE_STONE==m_eActorType) + return true; + + return false; +} + +bool CActorInstance::IsWarp() +{ + if (TYPE_WARP==m_eActorType) + return true; + + return false; +} + +bool CActorInstance::IsGoto() +{ + if (TYPE_GOTO==m_eActorType) + return true; + + return false; +} + +bool CActorInstance::IsBuilding() +{ + if (TYPE_BUILDING==m_eActorType) + return true; + + return false; +} + +bool CActorInstance::IsDoor() +{ + if (TYPE_DOOR==m_eActorType) + return true; + + return false; +} + +bool CActorInstance::IsObject() +{ + if (TYPE_OBJECT==m_eActorType) + return true; + + return false; +} + +void CActorInstance::DestroySystem() +{ +} + +void CActorInstance::DieEnd() +{ + Die(); + + CGraphicThingInstance::SetMotionAtEnd(); +} + +void CActorInstance::Die() +{ + if (m_isRealDead) + return; + + if (__IsMoveMotion()) + Stop(); + + SetAdvancingRotation(GetRotation()); + + if (IsStone()) + { + InterceptOnceMotion(CRaceMotionData::NAME_DEAD); + } + else + { + if (!__IsDieMotion()) + { + InterceptOnceMotion(CRaceMotionData::NAME_DEAD); + } + } + + m_isRealDead = TRUE; +} + +BOOL CActorInstance::IsSleep() +{ + return m_isSleep; +} + +BOOL CActorInstance::IsParalysis() +{ + return m_isParalysis; +} + +BOOL CActorInstance::IsFaint() +{ + return m_isFaint; +} + +BOOL CActorInstance::IsResistFallen() +{ + return m_isResistFallen; +} + +BOOL CActorInstance::IsMoving() +{ + return __IsMoveMotion(); +} + +BOOL CActorInstance::IsWaiting() +{ + return __IsWaitMotion(); +} + +BOOL CActorInstance::IsDead() +{ + return m_isRealDead; +} + +BOOL CActorInstance::IsKnockDown() +{ + return __IsKnockDownMotion(); +} + +BOOL CActorInstance::IsDamage() +{ + return __IsDamageMotion(); +} + +BOOL CActorInstance::IsAttacked() +{ + if (IsPushing()) + return TRUE; + + if (__IsDamageMotion()) + return TRUE; + + if (__IsKnockDownMotion()) + return TRUE; + + if (__IsDieMotion()) + return TRUE; + + return FALSE; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////// +// Process +void CActorInstance::PhysicsProcess() +{ + m_PhysicsObject.Update(m_fSecondElapsed); + AddMovement(m_PhysicsObject.GetXMovement(), m_PhysicsObject.GetYMovement(), 0.0f); +} + +void CActorInstance::__AccumulationMovement(float fRot) +{ + // NOTE - 일단은 WAIT로 미끄러짐 방지 + // 추후에는 RaceMotionData가 이동되는 모션인지에 대한 Flag를 갖고 있게끔 한다. - [levites] + if (CRaceMotionData::NAME_WAIT == __GetCurrentMotionIndex()) + return; + + D3DXMATRIX s_matRotationZ; + D3DXMatrixRotationZ(&s_matRotationZ, D3DXToRadian(fRot)); + UpdateTransform(&s_matRotationZ, GetAverageSecondElapsed()); + + AddMovement(s_matRotationZ._41, s_matRotationZ._42, s_matRotationZ._43); +} + +void CActorInstance::AccumulationMovement() +{ + if (m_pkTree) + return; + + if (m_pkHorse) + { + m_pkHorse->__AccumulationMovement(m_fcurRotation); + return; + } + + __AccumulationMovement(m_fAdvancingRotation); +} + +void CActorInstance::TransformProcess() +{ + if (!IsParalysis()) + { + m_x += m_v3Movement.x; + m_y += m_v3Movement.y; + m_z += m_v3Movement.z; + } + + __InitializeMovement(); + + SetPosition(m_x, m_y, m_z); +} + + +/////////////////////////////////////////////////////////////////////////////////////////////////// +// Process + +void CActorInstance::OnUpdateCollisionData(const CStaticCollisionDataVector * pscdVector) +{ + assert(pscdVector); + CStaticCollisionDataVector::const_iterator it; + for(it = pscdVector->begin();it!=pscdVector->end();++it) + { + const CStaticCollisionData & c_rColliData = *it; + const D3DXMATRIX & c_rMatrix = GetTransform(); + AddCollision(&c_rColliData, &c_rMatrix); + } +} + +void CActorInstance::OnUpdateHeighInstance(CAttributeInstance * pAttributeInstance) +{ + assert(pAttributeInstance); + SetHeightInstance(pAttributeInstance); +} + +bool CActorInstance::OnGetObjectHeight(float fX, float fY, float * pfHeight) +{ + if (!m_pHeightAttributeInstance) + return false; + + if (TYPE_BUILDING != GetType()) + return false; + + return m_pHeightAttributeInstance->GetHeight(fX, fY, pfHeight) == 1 ? true : false; +} + +////////////////////////////////////////////////////////////////// +// Battle +void CActorInstance::Revive() +{ + m_isSleep = FALSE; + m_isParalysis = FALSE; + m_isFaint = FALSE; + m_isRealDead = FALSE; + m_isStun = FALSE; + m_isWalking = FALSE; + m_isMain = FALSE; + m_isResistFallen = FALSE; + + __InitializeCollisionData(); +} + +BOOL CActorInstance::IsStun() +{ + return m_isStun; +} + +void CActorInstance::Stun() +{ + m_isStun = TRUE; +} + +void CActorInstance::SetWalkMode() +{ + m_isWalking = TRUE; + if (CRaceMotionData::NAME_RUN == GET_MOTION_INDEX(m_kCurMotNode.dwMotionKey)) + SetLoopMotion(CRaceMotionData::NAME_WALK, 0.15f, m_fMovSpd); +} + +void CActorInstance::SetRunMode() +{ + m_isWalking = FALSE; + if (CRaceMotionData::NAME_WALK == GET_MOTION_INDEX(m_kCurMotNode.dwMotionKey)) + SetLoopMotion(CRaceMotionData::NAME_RUN, 0.15f, m_fMovSpd); +} + +MOTION_KEY CActorInstance::GetNormalAttackIndex() +{ + WORD wMotionIndex; + m_pkCurRaceData->GetNormalAttackIndex(GetMotionMode(), &wMotionIndex); + + return MAKE_MOTION_KEY(GetMotionMode(), wMotionIndex); +} + +////////////////////////////////////////////////////////////////// +// Movement +void CActorInstance::__InitializeMovement() +{ + m_v3Movement.x = 0.0f; + m_v3Movement.y = 0.0f; + m_v3Movement.z = 0.0f; +} + +void CActorInstance::AddMovement(float fx, float fy, float fz) +{ + m_v3Movement.x += fx; + m_v3Movement.y += fy; + m_v3Movement.z += fz; +} + +const float gc_fActorSlideMoveSpeed = 5.0f; + +void CActorInstance::AdjustDynamicCollisionMovement(const CActorInstance * c_pActorInstance) +{ + if (m_pkHorse) + { + m_pkHorse->AdjustDynamicCollisionMovement(c_pActorInstance); + return; + } + + // NOTE : 기존의 Sphere Overlap됬을경우 처리가 비비기를 하면은 Penetration될 위험이 많아서 ( 실제로도 나왔고 --) + // Sphere간 Collision이 생겼을 경우 이전위치로 RollBack하는 방식으로 바꿨다. + // 단 BGObject에 대해서만. + + if (isAttacking() ) + return; + + UINT uActorType = c_pActorInstance->GetActorType(); + if( (uActorType == TYPE_BUILDING) || (uActorType == TYPE_OBJECT) || (uActorType == TYPE_DOOR) || (uActorType == TYPE_STONE)) + { + BlockMovement(); + + //Movement초기화 + /* m_v3Movement = D3DXVECTOR3(0.f,0.f,0.f); + + TCollisionPointInstanceListIterator itMain = m_BodyPointInstanceList.begin(); + for (; itMain != m_BodyPointInstanceList.end(); ++itMain) + { + CDynamicSphereInstanceVector & c_rMainSphereVector = (*itMain).SphereInstanceVector; + for (DWORD i = 0; i < c_rMainSphereVector.size(); ++i) + { + CDynamicSphereInstance & c_rMainSphere = c_rMainSphereVector[i]; + c_rMainSphere.v3Position =c_rMainSphere.v3LastPosition; + } + }*/ + } + else + { + + float move_length = D3DXVec3Length(&m_v3Movement); + if (move_length>gc_fActorSlideMoveSpeed) + m_v3Movement*=gc_fActorSlideMoveSpeed/move_length; + + TCollisionPointInstanceListIterator itMain = m_BodyPointInstanceList.begin(); + for (; itMain != m_BodyPointInstanceList.end(); ++itMain) + { + CDynamicSphereInstanceVector & c_rMainSphereVector = (*itMain).SphereInstanceVector; + for (DWORD i = 0; i < c_rMainSphereVector.size(); ++i) + { + CDynamicSphereInstance & c_rMainSphere = c_rMainSphereVector[i]; + + TCollisionPointInstanceList::const_iterator itOpp = c_pActorInstance->m_BodyPointInstanceList.begin(); + for(;itOpp != c_pActorInstance->m_BodyPointInstanceList.end();++itOpp) + { + CSphereCollisionInstance s; + s.GetAttribute().fRadius=itOpp->SphereInstanceVector[0].fRadius; + s.GetAttribute().v3Position=itOpp->SphereInstanceVector[0].v3Position; + D3DXVECTOR3 v3Delta = s.GetCollisionMovementAdjust(c_rMainSphere); + m_v3Movement+=v3Delta; + c_rMainSphere.v3Position+=v3Delta; + + if (v3Delta.x !=0.0f || v3Delta.y !=0.0f || v3Delta.z !=0.0f ) + { + move_length = D3DXVec3Length(&m_v3Movement); + if (move_length>gc_fActorSlideMoveSpeed) + { + m_v3Movement*=gc_fActorSlideMoveSpeed/move_length; + c_rMainSphere.v3Position = c_rMainSphere.v3LastPosition; + c_rMainSphere.v3Position+=m_v3Movement; + } + } + } + } + } + } +} + + +void CActorInstance::__AdjustCollisionMovement(const CGraphicObjectInstance * c_pGraphicObjectInstance) +{ + if (m_pkHorse) + { + m_pkHorse->__AdjustCollisionMovement(c_pGraphicObjectInstance); + return; + } + + // Body는 하나임을 가정합니다. + + if (m_v3Movement.x == 0.0f && m_v3Movement.y == 0.0f && m_v3Movement.z == 0.0f) + return; + + float move_length = D3DXVec3Length(&m_v3Movement); + if (move_length>gc_fActorSlideMoveSpeed) + m_v3Movement*=gc_fActorSlideMoveSpeed/move_length; + + TCollisionPointInstanceListIterator itMain = m_BodyPointInstanceList.begin(); + for (; itMain != m_BodyPointInstanceList.end(); ++itMain) + { + CDynamicSphereInstanceVector & c_rMainSphereVector = (*itMain).SphereInstanceVector; + for (DWORD i = 0; i < c_rMainSphereVector.size(); ++i) + { + CDynamicSphereInstance & c_rMainSphere = c_rMainSphereVector[i]; + + D3DXVECTOR3 v3Delta = c_pGraphicObjectInstance->GetCollisionMovementAdjust(c_rMainSphere); + m_v3Movement+=v3Delta; + c_rMainSphere.v3Position+=v3Delta; + + if (v3Delta.x !=0.0f || v3Delta.y !=0.0f || v3Delta.z !=0.0f ) + { + move_length = D3DXVec3Length(&m_v3Movement); + if (move_length>gc_fActorSlideMoveSpeed) + { + m_v3Movement*=gc_fActorSlideMoveSpeed/move_length; + c_rMainSphere.v3Position = c_rMainSphere.v3LastPosition; + c_rMainSphere.v3Position+=m_v3Movement; + } + } + + /*if (c_pObjectInstance->CollisionDynamicSphere(c_rMainSphere)) + { + const D3DXVECTOR3 & c_rv3Position = c_pObjectInstance->GetPosition(); + //if (GetVector3Distance(c_rMainSphere.v3Position, c_rv3Position) < + // GetVector3Distance(c_rMainSphere.v3LastPosition, c_rv3Position)) + { + return TRUE; + } + + return FALSE; + }*/ + } + } +} + +BOOL CActorInstance::IsMovement() +{ + if (m_pkHorse) + if (m_pkHorse->IsMovement()) + return TRUE; + + if (0.0f != m_v3Movement.x) + return TRUE; + if (0.0f != m_v3Movement.y) + return TRUE; + if (0.0f != m_v3Movement.z) + return TRUE; + + return FALSE; +} + +float CActorInstance::GetHeight() +{ + return CGraphicThingInstance::GetHeight(); +} + +bool CActorInstance::IntersectDefendingSphere() +{ + for (TCollisionPointInstanceList::iterator it = m_DefendingPointInstanceList.begin(); it != m_DefendingPointInstanceList.end(); ++it) + { + CDynamicSphereInstanceVector & rSphereInstanceVector = (*it).SphereInstanceVector; + + CDynamicSphereInstanceVector::iterator it2 = rSphereInstanceVector.begin(); + for (; it2 != rSphereInstanceVector.end(); ++it2) + { + CDynamicSphereInstance & rInstance = *it2; + D3DXVECTOR3 v3SpherePosition = rInstance.v3Position; + float fRadius = rInstance.fRadius; + + D3DXVECTOR3 v3Orig; + D3DXVECTOR3 v3Dir; + float fRange; + ms_Ray.GetStartPoint(&v3Orig); + ms_Ray.GetDirection(&v3Dir, &fRange); + + D3DXVECTOR3 v3Distance = v3Orig - v3SpherePosition; + float b = D3DXVec3Dot(&v3Dir, &v3Distance); + float c = D3DXVec3Dot(&v3Distance, &v3Distance) - fRadius*fRadius; + + if (b*b - c >= 0) + return true; + } + } + return false; +} + +bool CActorInstance::__IsMountingHorse() +{ + return NULL != m_pkHorse; +} + +void CActorInstance::MountHorse(CActorInstance * pkHorse) +{ + m_pkHorse = pkHorse; + + if (m_pkHorse) + { + m_pkHorse->SetCurPixelPosition(NEW_GetCurPixelPositionRef()); + m_pkHorse->SetRotation(GetRotation()); + m_pkHorse->SetAdvancingRotation(GetRotation()); + } +} + +void CActorInstance::__CreateTree(const char * c_szFileName) +{ + __DestroyTree(); + + CSpeedTreeForestDirectX8& rkForest=CSpeedTreeForestDirectX8::Instance(); + m_pkTree=rkForest.CreateInstance(m_x, m_y, m_z, GetCaseCRC32(c_szFileName, strlen(c_szFileName)), c_szFileName); + m_pkTree->SetPosition(m_x, m_y, m_z); + m_pkTree->UpdateBoundingSphere(); + m_pkTree->UpdateCollisionData(); +} + +void CActorInstance::__DestroyTree() +{ + if (!m_pkTree) + return; + + CSpeedTreeForestDirectX8::Instance().DeleteInstance(m_pkTree); +} + +void CActorInstance::__SetTreePosition(float fx, float fy, float fz) +{ + if (!m_pkTree) + return; + if (m_x == fx && m_y == fy && m_z == fz) + return; + + m_pkTree->SetPosition(fx, fy, fz); + m_pkTree->UpdateBoundingSphere(); + m_pkTree->UpdateCollisionData(); +} + +void CActorInstance::ClearAttachingEffect() +{ + __ClearAttachingEffect(); +} + +void CActorInstance::Destroy() +{ + ClearFlyTargeter(); + + m_HitDataMap.clear(); + m_MotionDeque.clear(); + + if (m_pAttributeInstance) + { + m_pAttributeInstance->Clear(); + CAttributeInstance::Delete(m_pAttributeInstance); + m_pAttributeInstance = NULL; + } + + __ClearAttachingEffect(); + + CGraphicThingInstance::Clear(); + + __DestroyWeaponTrace(); + __DestroyTree(); + //m_PhysicsObject.SetActorInstance(NULL); + + + __Initialize(); +} + +void CActorInstance::__InitializeRotationData() +{ + m_fAtkDirRot = 0.0f; + m_fcurRotation = 0.0f; + m_rotBegin = 0.0f; + m_rotEnd = 0.0f; + m_rotEndTime = 0.0f; + m_rotBeginTime = 0.0f; + m_rotBlendTime = 0.0f; + m_fAdvancingRotation = 0.0f; + m_rotX = 0.0f; + m_rotY = 0.0f; +} + + +void CActorInstance::__InitializeStateData() +{ + m_bEffectInitialized = false; + + m_isPreInput = FALSE; + m_isNextPreInput = FALSE; + + m_isSleep = FALSE; + m_isParalysis = FALSE; + m_isFaint = FALSE; + m_isRealDead = FALSE; + m_isWalking = FALSE; + m_isMain = FALSE; + m_isStun = FALSE; + m_isHiding = FALSE; + m_isResistFallen = FALSE; + + m_iRenderMode = RENDER_MODE_NORMAL; + m_fAlphaValue = 0.0f; + m_AddColor = D3DXCOLOR(0.0f, 0.0f, 0.0f, 1.0f); + + m_dwMtrlColor=0xffffffff; + m_dwMtrlAlpha=0xff000000; + + m_dwBattleHitEffectID = 0; + m_dwBattleAttachEffectID = 0; +} + +void CActorInstance::__InitializeMotionData() +{ + m_wcurMotionMode = CRaceMotionData::MODE_GENERAL; + m_wcurComboType = 0; + + m_fReachScale=1.0f; + m_fMovSpd=1.0f; + m_fAtkSpd=1.0f; + + m_fInvisibleTime = 0.0f; + + m_kSplashArea.isEnableHitProcess=TRUE; + m_kSplashArea.uSkill=0; + m_kSplashArea.MotionKey=0; + m_kSplashArea.fDisappearingTime = 0.0f; + m_kSplashArea.SphereInstanceVector.clear(); + m_kSplashArea.HittedInstanceMap.clear(); + + memset(&m_kCurMotNode, 0, sizeof(m_kCurMotNode)); + + __ClearCombo(); +} + +void CActorInstance::__Initialize() +{ + m_pkCurRaceMotionData=NULL; + m_pkCurRaceData=NULL; + m_pkHorse=NULL; + m_pkTree=NULL; + + m_fOwnerBaseTime=0.0f; + + m_eActorType = TYPE_PC; + m_eRace = 0; + + m_eShape = 0; + m_eHair = 0; + + m_dwSelfVID = 0; + m_dwOwnerVID = 0; + + m_pkEventHandler = NULL; + + m_PhysicsObject.Initialize(); + + m_pAttributeInstance = NULL; + + m_pFlyEventHandler = 0; + + m_v3FishingPosition = D3DXVECTOR3(0.0f, 0.0f, 0.0f); + m_iFishingEffectID = -1; + + m_pkHorse = NULL; + + __InitializePositionData(); + __InitializeRotationData(); + __InitializeMotionData(); + __InitializeStateData(); + __InitializeCollisionData(); + + __BlendAlpha_Initialize(); + + ClearFlyTargeter(); +} + +CActorInstance::CActorInstance() +{ + __Initialize(); + m_PhysicsObject.SetActorInstance(this); +} + +CActorInstance::~CActorInstance() +{ + Destroy(); +} diff --git a/extension/src/port/GameLib/ActorInstanceData.cpp b/extension/src/port/GameLib/ActorInstanceData.cpp new file mode 100644 index 00000000..c8b9cc46 --- /dev/null +++ b/extension/src/port/GameLib/ActorInstanceData.cpp @@ -0,0 +1,358 @@ +#include "StdAfx.h" +#include "ActorInstance.h" +#include "RaceManager.h" +#include "ItemManager.h" +#include "RaceData.h" + +#include "../EterLib/ResourceManager.h" +#include "../EterGrnLib/Util.h" + +DWORD CActorInstance::GetVirtualID() +{ + return m_dwSelfVID; +} + +void CActorInstance::SetVirtualID(DWORD dwVID) +{ + m_dwSelfVID=dwVID; +} + +void CActorInstance::UpdateAttribute() +{ + if (!m_pAttributeInstance) + return; + + if (!m_bNeedUpdateCollision) + return; + + m_bNeedUpdateCollision = FALSE; + + const CStaticCollisionDataVector & c_rkVec_ColliData = m_pAttributeInstance->GetObjectPointer()->GetCollisionDataVector(); + UpdateCollisionData(&c_rkVec_ColliData); + + m_pAttributeInstance->RefreshObject(GetTransform()); + UpdateHeightInstance(m_pAttributeInstance); + + //BOOL isHeightData = m_pAttributeInstance->IsEmpty(); +} + +void CActorInstance::__CreateAttributeInstance(CAttributeData * pData) +{ + m_pAttributeInstance = CAttributeInstance::New(); + m_pAttributeInstance->Clear(); + m_pAttributeInstance->SetObjectPointer(pData); + if (pData->IsEmpty()) + { + m_pAttributeInstance->Clear(); + CAttributeInstance::Delete(m_pAttributeInstance); + } +} + +DWORD CActorInstance::GetRace() +{ + return m_eRace; +} + +bool CActorInstance::SetRace(DWORD eRace) +{ + CRaceData * pRaceData; + if (!CRaceManager::Instance().GetRaceDataPointer(eRace, &pRaceData)) + { + m_eRace=0; + m_pkCurRaceData=NULL; + return false; + } + + m_eRace=eRace; + m_pkCurRaceData = pRaceData; + + CAttributeData * pAttributeData = pRaceData->GetAttributeDataPtr(); + if (pAttributeData) + { + __CreateAttributeInstance(pAttributeData); + } + + memset(m_adwPartItemID, 0, sizeof(m_adwPartItemID)); + + // Setup Graphic ResourceData + __ClearAttachingEffect(); + + CGraphicThingInstance::Clear(); + + //NOTE : PC만 Part별로 다 생성하게 해준다. + if( IsPC()) + { + CGraphicThingInstance::ReserveModelThing(CRaceData::PART_MAX_NUM); + CGraphicThingInstance::ReserveModelInstance(CRaceData::PART_MAX_NUM); + } + else + { + CGraphicThingInstance::ReserveModelThing(1); + CGraphicThingInstance::ReserveModelInstance(1); + } + + + CRaceData::TMotionModeDataIterator itor; + + if (pRaceData->CreateMotionModeIterator(itor)) + { + do + { + WORD wMotionMode = itor->first; + CRaceData::TMotionModeData * pMotionModeData = itor->second; + + CRaceData::TMotionVectorMap::iterator itorMotion = pMotionModeData->MotionVectorMap.begin(); + for (; itorMotion != pMotionModeData->MotionVectorMap.end(); ++itorMotion) + { + WORD wMotionIndex = itorMotion->first; + const CRaceData::TMotionVector & c_rMotionVector = itorMotion->second; + CRaceData::TMotionVector::const_iterator it; + DWORD i; + for (i = 0, it = c_rMotionVector.begin(); it != c_rMotionVector.end(); ++i, ++it) + { + DWORD dwMotionKey = MAKE_RANDOM_MOTION_KEY(wMotionMode, wMotionIndex, i); + CGraphicThingInstance::RegisterMotionThing(dwMotionKey, it->pMotion); + } + } + } + while (pRaceData->NextMotionModeIterator(itor)); + } + + return true; +} + +void CActorInstance::SetHair(DWORD eHair) +{ + m_eHair = eHair; + + CRaceData * pRaceData; + + if (!CRaceManager::Instance().GetRaceDataPointer(m_eRace, &pRaceData)) + return; + + CRaceData::SHair* pkHair=pRaceData->FindHair(eHair); + if (pkHair) + { + if (!pkHair->m_stModelFileName.empty()) + { + CGraphicThing * pkHairThing = (CGraphicThing *)CResourceManager::Instance().GetResourcePointer(pkHair->m_stModelFileName.c_str()); + RegisterModelThing(CRaceData::PART_HAIR, pkHairThing); + SetModelInstance(CRaceData::PART_HAIR, CRaceData::PART_HAIR, 0, CRaceData::PART_MAIN); + } + + const std::vector& c_rkVct_kSkin = pkHair->m_kVct_kSkin; + std::vector::const_iterator i; + for (i = c_rkVct_kSkin.begin(); i != c_rkVct_kSkin.end(); ++i) + { + const CRaceData::SSkin& c_rkSkinItem = *i; + + CResource * pkRes = CResourceManager::Instance().GetResourcePointer(c_rkSkinItem.m_stDstFileName.c_str()); + + if (pkRes) + SetMaterialImagePointer(CRaceData::PART_HAIR, c_rkSkinItem.m_stSrcFileName.c_str(), static_cast(pkRes)); + } + } +} + + + +void CActorInstance::SetShape(DWORD eShape, float fSpecular) +{ + m_eShape = eShape; + + CRaceData * pRaceData; + if (!CRaceManager::Instance().GetRaceDataPointer(m_eRace, &pRaceData)) + return; + + CRaceData::SShape* pkShape=pRaceData->FindShape(eShape); + if (pkShape) + { + CResourceManager& rkResMgr=CResourceManager::Instance(); + + if (pkShape->m_stModelFileName.empty()) + { + CGraphicThing* pModelThing = pRaceData->GetBaseModelThing(); + RegisterModelThing(0, pModelThing); + } + else + { + CGraphicThing* pModelThing = (CGraphicThing *)rkResMgr.GetResourcePointer(pkShape->m_stModelFileName.c_str()); + RegisterModelThing(0, pModelThing); + } + + { + std::string stLODModelFileName; + + char szLODModelFileNameEnd[256]; + for (UINT uLODIndex=1; uLODIndex<=3; ++uLODIndex) + { + sprintf(szLODModelFileNameEnd, "_lod_%.2d.gr2", uLODIndex); + stLODModelFileName = CFileNameHelper::NoExtension(pkShape->m_stModelFileName) + szLODModelFileNameEnd; + if (!rkResMgr.IsFileExist(stLODModelFileName.c_str())) + break; + + CGraphicThing* pLODModelThing = (CGraphicThing *)rkResMgr.GetResourcePointer(stLODModelFileName.c_str()); + if (!pLODModelThing) + break; + + RegisterLODThing(0, pLODModelThing); + } + } + + SetModelInstance(0, 0, 0); + + const std::vector& c_rkVct_kSkin = pkShape->m_kVct_kSkin; + std::vector::const_iterator i; + for (i = c_rkVct_kSkin.begin(); i != c_rkVct_kSkin.end(); ++i) + { + const CRaceData::SSkin& c_rkSkinItem = *i; + + CResource * pkRes = CResourceManager::Instance().GetResourcePointer(c_rkSkinItem.m_stDstFileName.c_str()); + + if (pkRes) + { + if (fSpecular > 0.0f) + { + SMaterialData kMaterialData; + kMaterialData.pImage = static_cast(pkRes); + kMaterialData.isSpecularEnable = TRUE; + kMaterialData.fSpecularPower = fSpecular; + kMaterialData.bSphereMapIndex = 0; + SetMaterialData(c_rkSkinItem.m_ePart, c_rkSkinItem.m_stSrcFileName.c_str(), kMaterialData); + } + else + { + SetMaterialImagePointer(c_rkSkinItem.m_ePart, c_rkSkinItem.m_stSrcFileName.c_str(), static_cast(pkRes)); + } + } + } + } + else + { + if (pRaceData->IsTree()) + { + __CreateTree(pRaceData->GetTreeFileName()); + } + else + { + CGraphicThing* pModelThing = pRaceData->GetBaseModelThing(); + RegisterModelThing(0, pModelThing); + + CGraphicThing* pLODModelThing = pRaceData->GetLODModelThing(); + RegisterLODThing(0, pLODModelThing); + + SetModelInstance(0, 0, 0); + } + } + + // Attaching Objects + for (DWORD i = 0; i < pRaceData->GetAttachingDataCount(); ++i) + { + const NRaceData::TAttachingData * c_pAttachingData; + if (!pRaceData->GetAttachingDataPointer(i, &c_pAttachingData)) + continue; + + switch (c_pAttachingData->dwType) + { + case NRaceData::ATTACHING_DATA_TYPE_EFFECT: + if (c_pAttachingData->isAttaching) + { + AttachEffectByName(0, c_pAttachingData->strAttachingBoneName.c_str(), c_pAttachingData->pEffectData->strFileName.c_str()); + } + else + { + AttachEffectByName(0, 0, c_pAttachingData->pEffectData->strFileName.c_str()); + } + break; + } + } +} + +void CActorInstance::ChangeMaterial(const char * c_szFileName) +{ + CRaceData * pRaceData; + if (!CRaceManager::Instance().GetRaceDataPointer(m_eRace, &pRaceData)) + return; + + CRaceData::SShape* pkShape=pRaceData->FindShape(m_eShape); + if (!pkShape) + return; + + const std::vector& c_rkVct_kSkin = pkShape->m_kVct_kSkin; + if (c_rkVct_kSkin.empty()) + return; + + std::vector::const_iterator i = c_rkVct_kSkin.begin(); + const CRaceData::SSkin& c_rkSkinItem = *i; + + std::string dstFileName = "d:/ymir work/npc/guild_symbol/guild_symbol.dds"; + dstFileName = c_szFileName; + + CResource * pkRes = CResourceManager::Instance().GetResourcePointer(dstFileName.c_str()); + if (!pkRes) + return; + + SetMaterialImagePointer(c_rkSkinItem.m_ePart, c_rkSkinItem.m_stSrcFileName.c_str(), static_cast(pkRes)); +} +/* +void CActorInstance::SetPart(DWORD dwPartIndex, DWORD dwItemID) +{ + if (dwPartIndex>=CRaceData::PART_MAX_NUM) + return; + + if (!m_pkCurRaceData) + { + assert(m_pkCurRaceData); + return; + } + + CItemData * pItemData; + if (!CItemManager::Instance().GetItemDataPointer(dwItemID, &pItemData)) + return; + + RegisterModelThing(dwPartIndex, pItemData->GetModelThing()); + for (DWORD i = 0; i < pItemData->GetLODModelThingCount(); ++i) + { + CGraphicThing * pThing; + if (!pItemData->GetLODModelThingPointer(i, &pThing)) + continue; + + RegisterLODThing(dwPartIndex, pThing); + } + SetModelInstance(dwPartIndex, dwPartIndex, 0); + + m_adwPartItemID[dwPartIndex] = dwItemID; +} +*/ + +DWORD CActorInstance::GetPartItemID(DWORD dwPartIndex) +{ + if (dwPartIndex>=CRaceData::PART_MAX_NUM) + { + TraceError("CActorInstance::GetPartIndex(dwPartIndex=%d/CRaceData::PART_MAX_NUM=%d)", dwPartIndex, CRaceData::PART_MAX_NUM); + return 0; + } + + return m_adwPartItemID[dwPartIndex]; +} + +void CActorInstance::SetSpecularInfo(BOOL bEnable, int iPart, float fAlpha) +{ + CRaceData * pkRaceData; + if (!CRaceManager::Instance().GetRaceDataPointer(m_eRace, &pkRaceData)) + return; + + CRaceData::SShape * pkShape = pkRaceData->FindShape(m_eShape); + if (pkShape->m_kVct_kSkin.empty()) + return; + + std::string filename = pkShape->m_kVct_kSkin[0].m_stSrcFileName.c_str(); + CFileNameHelper::ChangeDosPath(filename); + + CGraphicThingInstance::SetSpecularInfo(iPart, filename.c_str(), bEnable, fAlpha); +} + +void CActorInstance::SetSpecularInfoForce(BOOL bEnable, int iPart, float fAlpha) +{ + CGraphicThingInstance::SetSpecularInfo(iPart, NULL, bEnable, fAlpha); +} diff --git a/extension/src/port/GameLib/RaceData.cpp b/extension/src/port/GameLib/RaceData.cpp new file mode 100644 index 00000000..25d3e9d0 --- /dev/null +++ b/extension/src/port/GameLib/RaceData.cpp @@ -0,0 +1,598 @@ +#include "StdAfx.h" +#include "../EterLib/ResourceManager.h" +#include "../EterLib/AttributeInstance.h" +#include "../EterBase/Utils.h" +#include "RaceData.h" +#include "RaceMotionData.h" +#include "../EterBase/Filename.h" + +CDynamicPool CRaceData::ms_kPool; +CDynamicPool CRaceData::ms_MotionModeDataPool; + +const std::string& CRaceData::GetSmokeBone() +{ + return m_strSmokeBoneName; +} + +DWORD CRaceData::GetSmokeEffectID(UINT eSmoke) +{ + if(eSmoke>=SMOKE_NUM) + { + TraceError("CRaceData::GetSmokeEffectID(eSmoke=%d)", eSmoke); + return 0; + } + + return m_adwSmokeEffectID[eSmoke]; +} + +CRaceData::SHair* CRaceData::FindHair(UINT eHair) +{ + std::map::iterator f=m_kMap_dwHairKey_kHair.find(eHair); + if (m_kMap_dwHairKey_kHair.end()==f) + { + if (eHair != 0) + TraceError("Hair number %d is not exist.",eHair); + return NULL; + } + + return &f->second; +} + +void CRaceData::SetHairSkin(UINT eHair, UINT ePart, const char * c_szModelFileName, const char* c_szSrcFileName, const char* c_szDstFileName) +{ + SSkin kSkin; + kSkin.m_ePart=ePart; + kSkin.m_stSrcFileName=c_szSrcFileName; + kSkin.m_stDstFileName=c_szDstFileName; + + CFileNameHelper::ChangeDosPath(kSkin.m_stSrcFileName); + m_kMap_dwHairKey_kHair[eHair].m_kVct_kSkin.push_back(kSkin); + m_kMap_dwHairKey_kHair[eHair].m_stModelFileName = c_szModelFileName; +} + +CRaceData::SShape* CRaceData::FindShape(UINT eShape) +{ + std::map::iterator f=m_kMap_dwShapeKey_kShape.find(eShape); + if (m_kMap_dwShapeKey_kShape.end()==f) + return NULL; + + return &f->second; +} + +void CRaceData::SetShapeModel(UINT eShape, const char* c_szModelFileName) +{ + m_kMap_dwShapeKey_kShape[eShape].m_stModelFileName=c_szModelFileName; +} + +void CRaceData::AppendShapeSkin(UINT eShape, UINT ePart, const char* c_szSrcFileName, const char* c_szDstFileName) +{ + SSkin kSkin; + kSkin.m_ePart=ePart; + kSkin.m_stSrcFileName=c_szSrcFileName; + kSkin.m_stDstFileName=c_szDstFileName; + + CFileNameHelper::ChangeDosPath(kSkin.m_stSrcFileName); + m_kMap_dwShapeKey_kShape[eShape].m_kVct_kSkin.push_back(kSkin); +} + +CRaceData* CRaceData::New() +{ + return ms_kPool.Alloc(); +} + +void CRaceData::Delete(CRaceData* pkRaceData) +{ + pkRaceData->Destroy(); + ms_kPool.Free(pkRaceData); +} + +void CRaceData::CreateSystem(UINT uCapacity, UINT uMotModeCapacity) +{ + ms_MotionModeDataPool.Create(uMotModeCapacity); + ms_kPool.Create(uCapacity); +} + +void CRaceData::DestroySystem() +{ + ms_kPool.Destroy(); + ms_MotionModeDataPool.Destroy(); +} + +BOOL CRaceData::CreateMotionModeIterator(TMotionModeDataIterator & itor) +{ + if (m_pMotionModeDataMap.empty()) + return FALSE; + + itor = m_pMotionModeDataMap.begin(); + + return TRUE; +} +BOOL CRaceData::NextMotionModeIterator(TMotionModeDataIterator & itor) +{ + ++itor; + + return m_pMotionModeDataMap.end() != itor; +} + +BOOL CRaceData::GetMotionKey(WORD wMotionModeIndex, WORD wMotionIndex, MOTION_KEY * pMotionKey) +{ + TMotionModeData * pMotionModeData; + if (!GetMotionModeDataPointer(wMotionModeIndex, &pMotionModeData)) + return FALSE; + + if (pMotionModeData->MotionVectorMap.end() == pMotionModeData->MotionVectorMap.find(wMotionIndex)) + { + WORD wGeneralMode=CRaceMotionData::MODE_GENERAL; + + switch(wMotionModeIndex) + { + case CRaceMotionData::MODE_HORSE_ONEHAND_SWORD: + case CRaceMotionData::MODE_HORSE_TWOHAND_SWORD: + case CRaceMotionData::MODE_HORSE_DUALHAND_SWORD: + case CRaceMotionData::MODE_HORSE_FAN: + case CRaceMotionData::MODE_HORSE_BELL: + case CRaceMotionData::MODE_HORSE_BOW: + wGeneralMode=CRaceMotionData::MODE_HORSE; + break; + + default: + wGeneralMode=CRaceMotionData::MODE_GENERAL; + break; + } + + TMotionModeData * pMotionModeGeneralData; + if (!GetMotionModeDataPointer(wGeneralMode, &pMotionModeGeneralData)) + return FALSE; + + if (pMotionModeGeneralData->MotionVectorMap.end() == pMotionModeGeneralData->MotionVectorMap.find(wMotionIndex)) + return FALSE; + + *pMotionKey = MAKE_MOTION_KEY(wGeneralMode, wMotionIndex); + } + else + { + *pMotionKey = MAKE_MOTION_KEY(wMotionModeIndex, wMotionIndex); + } + + return TRUE; +} + +BOOL CRaceData::GetMotionModeDataPointer(WORD wMotionMode, TMotionModeData ** ppMotionModeData) +{ + TMotionModeDataIterator itor = m_pMotionModeDataMap.find(wMotionMode); + if (itor == m_pMotionModeDataMap.end()) + return FALSE; + + *ppMotionModeData = itor->second; + + return TRUE; +} + +BOOL CRaceData::GetModelDataPointer(DWORD dwModelIndex, const TModelData ** c_ppModelData) +{ + TModelDataMapIterator itor = m_ModelDataMap.find(dwModelIndex); + if (m_ModelDataMap.end() == itor) + return false; + + *c_ppModelData = &itor->second; + + return true; +} + +BOOL CRaceData::GetMotionVectorPointer(WORD wMotionMode, WORD wMotionIndex, TMotionVector ** ppMotionVector) +{ + TMotionModeData * pMotionModeData; + if (!GetMotionModeDataPointer(wMotionMode, &pMotionModeData)) + return FALSE; + + TMotionVectorMap::iterator itor = pMotionModeData->MotionVectorMap.find(wMotionIndex); + if (pMotionModeData->MotionVectorMap.end() == itor) + return FALSE; + + *ppMotionVector = &itor->second; + + return TRUE; +} + +BOOL CRaceData::GetMotionDataPointer(WORD wMotionMode, WORD wMotionIndex, WORD wMotionSubIndex, CRaceMotionData ** c_ppMotionData) +{ + const TMotionVector * c_pMotionVector; + if (!GetMotionVectorPointer(wMotionMode, wMotionIndex, &c_pMotionVector)) + return FALSE; + + if (wMotionSubIndex >= c_pMotionVector->size()) + return FALSE; + + const TMotion & c_rMotion = c_pMotionVector->at(wMotionSubIndex); + + if (!c_rMotion.pMotionData) + return FALSE; + + *c_ppMotionData = c_rMotion.pMotionData; + + return TRUE; +} + +BOOL CRaceData::GetMotionDataPointer(DWORD dwMotionKey, CRaceMotionData ** c_ppMotionData) +{ + return GetMotionDataPointer(GET_MOTION_MODE(dwMotionKey), GET_MOTION_INDEX(dwMotionKey), GET_MOTION_SUB_INDEX(dwMotionKey), c_ppMotionData); +} + +BOOL CRaceData::GetMotionVectorPointer(WORD wMotionMode, WORD wMotionIndex, const TMotionVector ** c_ppMotionVector) +{ + TMotionVector * pMotionVector; + if (!GetMotionVectorPointer(wMotionMode, wMotionIndex, &pMotionVector)) + return FALSE; + + *c_ppMotionVector = pMotionVector; + + return TRUE; +} + +DWORD CRaceData::GetAttachingDataCount() +{ + return m_AttachingDataVector.size(); +} + +BOOL CRaceData::GetAttachingDataPointer(DWORD dwIndex, const NRaceData::TAttachingData ** c_ppAttachingData) +{ + if (dwIndex >= GetAttachingDataCount()) + return FALSE; + + *c_ppAttachingData = &m_AttachingDataVector[dwIndex]; + + return TRUE; +} + +BOOL CRaceData::GetCollisionDataPointer(DWORD dwIndex, const NRaceData::TAttachingData ** c_ppAttachingData) +{ + if (dwIndex >= GetAttachingDataCount()) + return FALSE; + + if (NRaceData::ATTACHING_DATA_TYPE_COLLISION_DATA != m_AttachingDataVector[dwIndex].dwType) + return FALSE; + + *c_ppAttachingData = &m_AttachingDataVector[dwIndex]; + + return TRUE; +} + +BOOL CRaceData::GetBodyCollisionDataPointer(const NRaceData::TAttachingData ** c_ppAttachingData) +{ + for (DWORD i = 0; i < m_AttachingDataVector.size(); ++i) + { + const NRaceData::TAttachingData * pAttachingData = &m_AttachingDataVector[i]; + + if (NRaceData::ATTACHING_DATA_TYPE_COLLISION_DATA == pAttachingData->dwType) + if (NRaceData::COLLISION_TYPE_BODY == pAttachingData->pCollisionData->iCollisionType) + { + *c_ppAttachingData = pAttachingData; + return true; + } + } + + return FALSE; +} + +void CRaceData::SetRace(DWORD dwRaceIndex) +{ + m_dwRaceIndex = dwRaceIndex; +} + +void CRaceData::RegisterAttachingBoneName(DWORD dwPartIndex, const char * c_szBoneName) +{ + m_AttachingBoneNameMap.insert(TAttachingBoneNameMap::value_type(dwPartIndex, c_szBoneName)); +} + +void CRaceData::RegisterMotionMode(WORD wMotionModeIndex) +{ + TMotionModeData * pMotionModeData = ms_MotionModeDataPool.Alloc(); + pMotionModeData->wMotionModeIndex = wMotionModeIndex; + pMotionModeData->MotionVectorMap.clear(); + m_pMotionModeDataMap.insert(TMotionModeDataMap::value_type(wMotionModeIndex, pMotionModeData)); +} + +CGraphicThing* CRaceData::NEW_RegisterMotion(CRaceMotionData* pkMotionData, WORD wMotionModeIndex, WORD wMotionIndex, const char * c_szFileName, BYTE byPercentage) +{ + CGraphicThing * pMotionThing = (CGraphicThing *)CResourceManager::Instance().GetResourcePointer(c_szFileName); + + TMotionModeData * pMotionModeData; + if (!GetMotionModeDataPointer(wMotionModeIndex, &pMotionModeData)) + { + AssertLog("Failed getting motion mode data!"); + return NULL; + } + + TMotion kMotion; + kMotion.byPercentage = byPercentage; + kMotion.pMotion = pMotionThing; + kMotion.pMotionData = pkMotionData; + pMotionModeData->MotionVectorMap[wMotionIndex].push_back(kMotion); + + return pMotionThing; +} + +CGraphicThing* CRaceData::RegisterMotionData(WORD wMotionMode, WORD wMotionIndex, const char * c_szFileName, BYTE byPercentage) +{ + CRaceMotionData * pRaceMotionData = CRaceMotionData::New(); + if (!pRaceMotionData->LoadMotionData(c_szFileName)) + { + TraceError("CRaceData::RegisterMotionData - LoadMotionData(c_szFileName=%s) ERROR", c_szFileName); + CRaceMotionData::Delete(pRaceMotionData); + pRaceMotionData = NULL; + return NULL; + } + + // 2004. 3. 15. myevan. 원래는 모션내 인덱스 정보가 있어야 한다. + pRaceMotionData->SetName(wMotionIndex); + + ///// + + // FIXME : 이미 GR2가 로드 되어 있을 경우에는 어떻게 해야 하는가? + // 현재는 똑같은 것이 하나 더 추가 되어 버린다. - [levites] + + return NEW_RegisterMotion(pRaceMotionData, wMotionMode, wMotionIndex, pRaceMotionData->GetMotionFileName(), byPercentage); + + // 2004.09.03.myevan.새로운함수로 대처 + //TMotion Motion; + //Motion.byPercentage = byPercentage; + //Motion.pMotion = (CGraphicThing *)CResourceManager::Instance().GetResourcePointer(pRaceMotionData->GetMotionFileName()); + //Motion.pMotionData = pRaceMotionData; + //__OLD_RegisterMotion(wMotionMode, wMotionIndex, Motion); + //return true; +} + + +void CRaceData::OLD_RegisterMotion(WORD wMotionModeIndex, WORD wMotionIndex, const char * c_szFileName, BYTE byPercentage) +{ + CGraphicThing * pThing = (CGraphicThing *)CResourceManager::Instance().GetResourcePointer(c_szFileName); + + TMotion Motion; + Motion.byPercentage = byPercentage; + Motion.pMotion = pThing; + Motion.pMotionData = NULL; + __OLD_RegisterMotion(wMotionModeIndex, wMotionIndex, Motion); +} + +void CRaceData::__OLD_RegisterMotion(WORD wMotionMode, WORD wMotionIndex, const TMotion & rMotion) +{ + TMotionModeData * pMotionModeData; + if (!GetMotionModeDataPointer(wMotionMode, &pMotionModeData)) + { + AssertLog("Failed getting motion mode data!"); + return; + } + + TMotionVectorMap::iterator itor = pMotionModeData->MotionVectorMap.find(wMotionIndex); + if (pMotionModeData->MotionVectorMap.end() == itor) + { + TMotionVector MotionVector; + MotionVector.push_back(rMotion); + + pMotionModeData->MotionVectorMap.insert(TMotionVectorMap::value_type(wMotionIndex, MotionVector)); + } + else + { + TMotionVector & rMotionVector = itor->second; + rMotionVector.push_back(rMotion); + } +} + + +bool CRaceData::SetMotionRandomWeight(WORD wMotionModeIndex, WORD wMotionIndex, WORD wMotionSubIndex, BYTE byPercentage) +{ + TMotionModeData * pMotionModeData; + + if (!GetMotionModeDataPointer(wMotionModeIndex, &pMotionModeData)) + { + //AssertLog("Failed getting motion mode data!"); + return false; + } + + TMotionVectorMap::iterator itor = pMotionModeData->MotionVectorMap.find(wMotionIndex); + + if (pMotionModeData->MotionVectorMap.end() != itor) + { + TMotionVector & rMotionVector = itor->second; + if (wMotionSubIndex < rMotionVector.size()) + { + rMotionVector[wMotionSubIndex].byPercentage = byPercentage; + } + else + { + return false; + } + } + else + { + TraceError("CRaceData::SetMotionRandomWeight(wMotionModeIndex=%d, wMotionIndex=%d, wMotionSubIndex=%d, byPercentage=%d) - Find Motion(wMotionIndex=%d) FAILED", + wMotionModeIndex, wMotionIndex, wMotionSubIndex, byPercentage, wMotionModeIndex); + + return false; + } + + return true; +} + +void CRaceData::RegisterNormalAttack(WORD wMotionModeIndex, WORD wMotionIndex) +{ + m_NormalAttackIndexMap.insert(TNormalAttackIndexMap::value_type(wMotionModeIndex, wMotionIndex)); +} +BOOL CRaceData::GetNormalAttackIndex(WORD wMotionModeIndex, WORD * pwMotionIndex) +{ + TNormalAttackIndexMap::iterator itor = m_NormalAttackIndexMap.find(wMotionModeIndex); + + if (m_NormalAttackIndexMap.end() == itor) + return FALSE; + + *pwMotionIndex = itor->second; + + return TRUE; +} + +void CRaceData::ReserveComboAttack(WORD wMotionModeIndex, WORD wComboType, DWORD dwComboCount) +{ + TComboData ComboData; + ComboData.ComboIndexVector.clear(); + ComboData.ComboIndexVector.resize(dwComboCount); + m_ComboAttackDataMap.insert(TComboAttackDataMap::value_type(MAKE_COMBO_KEY(wMotionModeIndex, wComboType), ComboData)); +} + +void CRaceData::RegisterComboAttack(WORD wMotionModeIndex, WORD wComboType, DWORD dwComboIndex, WORD wMotionIndex) +{ + TComboAttackDataIterator itor = m_ComboAttackDataMap.find(MAKE_COMBO_KEY(wMotionModeIndex, wComboType)); + if (m_ComboAttackDataMap.end() == itor) + return; + + TComboIndexVector & rComboIndexVector = itor->second.ComboIndexVector; + if (dwComboIndex >= rComboIndexVector.size()) + { + AssertLog("CRaceData::RegisterCombo - Strange combo index!"); + return; + } + + rComboIndexVector[dwComboIndex] = wMotionIndex; +} + +BOOL CRaceData::GetComboDataPointer(WORD wMotionModeIndex, WORD wComboType, TComboData ** ppComboData) +{ + TComboAttackDataIterator itor = m_ComboAttackDataMap.find(MAKE_COMBO_KEY(wMotionModeIndex, wComboType)); + + if (m_ComboAttackDataMap.end() == itor) + return FALSE; + + *ppComboData = &itor->second; + return TRUE; +} + +const char * CRaceData::GetBaseModelFileName() const +{ + return m_strBaseModelFileName.c_str(); +} + +const char * CRaceData::GetAttributeFileName() const +{ + return m_strAttributeFileName.c_str(); +} + +const char* CRaceData::GetMotionListFileName() const +{ + return m_strMotionListFileName.c_str(); +} + +CGraphicThing * CRaceData::GetBaseModelThing() +{ + if (!m_pBaseModelThing) + { + m_pBaseModelThing = (CGraphicThing *)CResourceManager::Instance().GetResourcePointer(m_strBaseModelFileName.c_str()); + } + + return m_pBaseModelThing; +} + +CGraphicThing * CRaceData::GetLODModelThing() +{ + if (!m_pLODModelThing) + { + std::string strLODFileName = CFileNameHelper::NoExtension(m_strBaseModelFileName) + "_lod_01.gr2"; + if (CResourceManager::Instance().IsFileExist(strLODFileName.c_str())) + { + m_pLODModelThing = (CGraphicThing *)CResourceManager::Instance().GetResourcePointer(strLODFileName.c_str()); + } + } + + return m_pLODModelThing; +} + +CAttributeData * CRaceData::GetAttributeDataPtr() +{ + if (m_strAttributeFileName.empty()) + return NULL; + + if (!CResourceManager::Instance().IsFileExist(m_strAttributeFileName.c_str())) + return NULL; + + return (CAttributeData *)CResourceManager::Instance().GetResourcePointer(m_strAttributeFileName.c_str()); +} + +BOOL CRaceData::GetAttachingBoneName(DWORD dwPartIndex, const char ** c_pszBoneName) +{ + TAttachingBoneNameMap::iterator itor = m_AttachingBoneNameMap.find(dwPartIndex); + if (itor == m_AttachingBoneNameMap.end()) + return FALSE; + + const std::string & c_rstrBoneName = itor->second; + + *c_pszBoneName = c_rstrBoneName.c_str(); + + return TRUE; +} + +BOOL CRaceData::IsTree() +{ + return !m_strTreeFileName.empty(); +} + +const char * CRaceData::GetTreeFileName() +{ + return m_strTreeFileName.c_str(); +} + +void CRaceData::Destroy() +{ + m_kMap_dwHairKey_kHair.clear(); + m_kMap_dwShapeKey_kShape.clear(); + + m_strBaseModelFileName = ""; + m_strTreeFileName = ""; + m_strAttributeFileName = ""; + m_strMotionListFileName = "motlist.txt"; + + m_AttachingBoneNameMap.clear(); + m_ModelDataMap.clear(); + + m_NormalAttackIndexMap.clear(); + m_ComboAttackDataMap.clear(); + + TMotionModeDataMap::iterator itorMode = m_pMotionModeDataMap.begin(); + for (; itorMode != m_pMotionModeDataMap.end(); ++itorMode) + { + TMotionModeData * pMotionModeData = itorMode->second; + + TMotionVectorMap::iterator itorMotion = pMotionModeData->MotionVectorMap.begin(); + for (; itorMotion != pMotionModeData->MotionVectorMap.end(); ++itorMotion) + { + TMotionVector & rMotionVector = itorMotion->second; + for (DWORD i = 0; i < rMotionVector.size(); ++i) + { + CRaceMotionData::Delete(rMotionVector[i].pMotionData); + } + } + + ms_MotionModeDataPool.Free(pMotionModeData); + } + m_pMotionModeDataMap.clear(); + + __Initialize(); +} + +void CRaceData::__Initialize() +{ + m_strMotionListFileName = "motlist.txt"; + + m_pBaseModelThing = NULL; + m_pLODModelThing = NULL; + + m_dwRaceIndex = 0; + + memset(m_adwSmokeEffectID, 0, sizeof(m_adwSmokeEffectID)); +} + +CRaceData::CRaceData() +{ + __Initialize(); +} +CRaceData::~CRaceData() +{ + Destroy(); +} \ No newline at end of file diff --git a/extension/src/port/GameLib/RaceManager.cpp b/extension/src/port/GameLib/RaceManager.cpp new file mode 100644 index 00000000..58601698 --- /dev/null +++ b/extension/src/port/GameLib/RaceManager.cpp @@ -0,0 +1,451 @@ +#include "StdAfx.h" +#include "RaceManager.h" +#include "RaceMotionData.h" +#include "../EterPack/EterPackManager.h" + +bool __IsGuildRace(unsigned race) +{ + if (race >= 14000 && race < 15000) + return true; + + if (20043 == race) + return true; + + return false; +} + +bool __IsNPCRace(unsigned race) +{ + if (race > 9000) + return true; + + return false; +} + +void __GetRaceResourcePathes(unsigned race, std::vector & vec_stPathes) +{ + if (__IsGuildRace(race)) + { + vec_stPathes.push_back ("d:/ymir work/guild/"); + vec_stPathes.push_back ("d:/ymir work/npc/"); + vec_stPathes.push_back ("d:/ymir work/npc2/"); + vec_stPathes.push_back ("d:/ymir work/monster/"); + vec_stPathes.push_back ("d:/ymir work/monster2/"); + } + else if (__IsNPCRace(race)) + { + if (race >= 30000) + { + vec_stPathes.push_back ("d:/ymir work/npc2/"); + vec_stPathes.push_back ("d:/ymir work/npc/"); + vec_stPathes.push_back ("d:/ymir work/monster/"); + vec_stPathes.push_back ("d:/ymir work/monster2/"); + vec_stPathes.push_back ("d:/ymir work/guild/"); + } + else + { + vec_stPathes.push_back ("d:/ymir work/npc/"); + vec_stPathes.push_back ("d:/ymir work/npc2/"); + vec_stPathes.push_back ("d:/ymir work/monster/"); + vec_stPathes.push_back ("d:/ymir work/monster2/"); + vec_stPathes.push_back ("d:/ymir work/guild/"); + } + } + // 만우절 이벤트용 예외 몬스터 + else if (8507 == race || 8510 == race) + { + vec_stPathes.push_back ("d:/ymir work/monster2/"); + vec_stPathes.push_back ("d:/ymir work/monster/"); + vec_stPathes.push_back ("d:/ymir work/npc/"); + vec_stPathes.push_back ("d:/ymir work/npc2/"); + vec_stPathes.push_back ("d:/ymir work/guild/"); + } + else if (race > 8000) + { + vec_stPathes.push_back ("d:/ymir work/monster/"); + vec_stPathes.push_back ("d:/ymir work/monster2/"); + vec_stPathes.push_back ("d:/ymir work/npc/"); + vec_stPathes.push_back ("d:/ymir work/npc2/"); + vec_stPathes.push_back ("d:/ymir work/guild/"); + } + else if (race > 2000) + { + vec_stPathes.push_back ("d:/ymir work/monster2/"); + vec_stPathes.push_back ("d:/ymir work/monster/"); + vec_stPathes.push_back ("d:/ymir work/npc/"); + vec_stPathes.push_back ("d:/ymir work/npc2/"); + vec_stPathes.push_back ("d:/ymir work/guild/"); + } + else if (race>=1400 && race<=1700) + { + vec_stPathes.push_back ("d:/ymir work/monster2/"); + vec_stPathes.push_back ("d:/ymir work/monster/"); + vec_stPathes.push_back ("d:/ymir work/npc/"); + vec_stPathes.push_back ("d:/ymir work/npc2/"); + vec_stPathes.push_back ("d:/ymir work/guild/"); + } + else + { + vec_stPathes.push_back ("d:/ymir work/monster/"); + vec_stPathes.push_back ("d:/ymir work/monster2/"); + vec_stPathes.push_back ("d:/ymir work/npc/"); + vec_stPathes.push_back ("d:/ymir work/npc2/"); + vec_stPathes.push_back ("d:/ymir work/guild/"); + } + return; +} + +CRaceData* CRaceManager::__LoadRaceData(DWORD dwRaceIndex) +{ + std::map::iterator fRaceName=m_kMap_dwRaceKey_stRaceName.find(dwRaceIndex); + if (m_kMap_dwRaceKey_stRaceName.end()==fRaceName) + return NULL; + + const std::string& c_rstRaceName=fRaceName->second; + + if (c_rstRaceName.empty()) + return NULL; + + // LOAD_LOCAL_RESOURCE + if (c_rstRaceName[0] == '#') + { + const char* pathName = c_rstRaceName.c_str() + 1; + char shapeFileName[256]; + char motionListFileName[256]; + _snprintf(shapeFileName, sizeof(shapeFileName), "%sshape.msm", pathName); + _snprintf(motionListFileName, sizeof(motionListFileName), "%smotlist.txt", pathName); + + CRaceData * pRaceData = CRaceData::New(); + pRaceData->SetRace(dwRaceIndex); + if (!pRaceData->LoadRaceData(shapeFileName)) + { + TraceError("CRaceManager::RegisterRacePath(race=%u).LoadRaceData(%s)", dwRaceIndex, shapeFileName); + CRaceData::Delete(pRaceData); + return NULL; + } + + __LoadRaceMotionList(*pRaceData, pathName, motionListFileName); + + return pRaceData; + } + // END_OF_LOAD_LOCAL_RESOURCE + std::vector vec_stFullPathName; + __GetRaceResourcePathes(dwRaceIndex, vec_stFullPathName); + + CRaceData * pRaceData = CRaceData::New(); + pRaceData->SetRace(dwRaceIndex); + + for (int i = 0; i < vec_stFullPathName.size(); i++) + { + std::string stFullPathName = vec_stFullPathName[i]; + { + std::map::iterator fRaceSrcName=m_kMap_stRaceName_stSrcName.find(c_rstRaceName); + if (m_kMap_stRaceName_stSrcName.end()==fRaceSrcName) + stFullPathName+=c_rstRaceName; + else + stFullPathName+=fRaceSrcName->second; + } + + stFullPathName+="/"; + + std::string stMSMFileName=stFullPathName; + stMSMFileName+=c_rstRaceName; + stMSMFileName+=".msm"; + + if (!pRaceData->LoadRaceData(stMSMFileName.c_str())) + { + if (i != vec_stFullPathName.size() - 1) + { + TraceError("CRaceManager::RegisterRacePath : RACE[%u] LOAD MSMFILE[%s] ERROR. Will Find Another Path.", dwRaceIndex, stMSMFileName.c_str()); + continue; + } + + TraceError("CRaceManager::RegisterRacePath : RACE[%u] LOAD MSMFILE[%s] ERROR", dwRaceIndex, stMSMFileName.c_str()); + CRaceData::Delete(pRaceData); + return NULL; + } + + std::string stMotionListFileName=stFullPathName; + stMotionListFileName+=pRaceData->GetMotionListFileName(); + + __LoadRaceMotionList(*pRaceData, stFullPathName.c_str(), stMotionListFileName.c_str()); + + return pRaceData; + } + TraceError("CRaceManager::RegisterRacePath : RACE[%u] HAVE NO PATH ERROR", dwRaceIndex); + CRaceData::Delete(pRaceData); + return NULL; +} + +bool CRaceManager::__LoadRaceMotionList(CRaceData& rkRaceData, const char* pathName, const char* motionListFileName) +{ + static std::map s_kMap_stType_dwIndex; + static bool s_isInit=false; + + if (!s_isInit) + { + s_isInit=true; + + s_kMap_stType_dwIndex.insert(std::map::value_type("SPAWN", CRaceMotionData::NAME_SPAWN)); + s_kMap_stType_dwIndex.insert(std::map::value_type("WAIT", CRaceMotionData::NAME_WAIT)); + s_kMap_stType_dwIndex.insert(std::map::value_type("WAIT1", CRaceMotionData::NAME_WAIT)); + s_kMap_stType_dwIndex.insert(std::map::value_type("WAIT2", CRaceMotionData::NAME_WAIT)); + s_kMap_stType_dwIndex.insert(std::map::value_type("WALK", CRaceMotionData::NAME_WALK)); + s_kMap_stType_dwIndex.insert(std::map::value_type("WALK1", CRaceMotionData::NAME_WALK)); + s_kMap_stType_dwIndex.insert(std::map::value_type("WALK2", CRaceMotionData::NAME_WALK)); + s_kMap_stType_dwIndex.insert(std::map::value_type("RUN", CRaceMotionData::NAME_RUN)); + s_kMap_stType_dwIndex.insert(std::map::value_type("RUN1", CRaceMotionData::NAME_RUN)); + s_kMap_stType_dwIndex.insert(std::map::value_type("RUN2", CRaceMotionData::NAME_RUN)); + s_kMap_stType_dwIndex.insert(std::map::value_type("STOP", CRaceMotionData::NAME_STOP)); + s_kMap_stType_dwIndex.insert(std::map::value_type("DEAD", CRaceMotionData::NAME_DEAD)); + s_kMap_stType_dwIndex.insert(std::map::value_type("COMBO_ATTACK", CRaceMotionData::NAME_COMBO_ATTACK_1)); + s_kMap_stType_dwIndex.insert(std::map::value_type("COMBO_ATTACK1", CRaceMotionData::NAME_COMBO_ATTACK_2)); + s_kMap_stType_dwIndex.insert(std::map::value_type("COMBO_ATTACK2", CRaceMotionData::NAME_COMBO_ATTACK_3)); + s_kMap_stType_dwIndex.insert(std::map::value_type("NORMAL_ATTACK", CRaceMotionData::NAME_NORMAL_ATTACK)); + s_kMap_stType_dwIndex.insert(std::map::value_type("NORMAL_ATTACK1", CRaceMotionData::NAME_NORMAL_ATTACK)); + s_kMap_stType_dwIndex.insert(std::map::value_type("NORMAL_ATTACK2", CRaceMotionData::NAME_NORMAL_ATTACK)); + s_kMap_stType_dwIndex.insert(std::map::value_type("FRONT_DAMAGE", CRaceMotionData::NAME_DAMAGE)); + s_kMap_stType_dwIndex.insert(std::map::value_type("FRONT_DAMAGE1", CRaceMotionData::NAME_DAMAGE)); + s_kMap_stType_dwIndex.insert(std::map::value_type("FRONT_DAMAGE2", CRaceMotionData::NAME_DAMAGE)); + s_kMap_stType_dwIndex.insert(std::map::value_type("FRONT_DAMAGE3", CRaceMotionData::NAME_DAMAGE)); + s_kMap_stType_dwIndex.insert(std::map::value_type("FRONT_DEAD", CRaceMotionData::NAME_DEAD)); + s_kMap_stType_dwIndex.insert(std::map::value_type("FRONT_DEAD1", CRaceMotionData::NAME_DEAD)); + s_kMap_stType_dwIndex.insert(std::map::value_type("FRONT_DEAD2", CRaceMotionData::NAME_DEAD)); + s_kMap_stType_dwIndex.insert(std::map::value_type("FRONT_KNOCKDOWN", CRaceMotionData::NAME_DAMAGE_FLYING)); + s_kMap_stType_dwIndex.insert(std::map::value_type("FRONT_KNOCKDOWN1", CRaceMotionData::NAME_DAMAGE_FLYING)); + s_kMap_stType_dwIndex.insert(std::map::value_type("FRONT_STANDUP", CRaceMotionData::NAME_STAND_UP)); + s_kMap_stType_dwIndex.insert(std::map::value_type("FRONT_STANDUP1", CRaceMotionData::NAME_STAND_UP)); + s_kMap_stType_dwIndex.insert(std::map::value_type("BACK_DAMAGE", CRaceMotionData::NAME_DAMAGE_BACK)); + s_kMap_stType_dwIndex.insert(std::map::value_type("BACK_DAMAGE1", CRaceMotionData::NAME_DAMAGE_BACK)); + s_kMap_stType_dwIndex.insert(std::map::value_type("BACK_DEAD", CRaceMotionData::NAME_DEAD_BACK)); + s_kMap_stType_dwIndex.insert(std::map::value_type("BACK_DEAD1", CRaceMotionData::NAME_DEAD_BACK)); + s_kMap_stType_dwIndex.insert(std::map::value_type("BACK_DEAD2", CRaceMotionData::NAME_DEAD_BACK)); + s_kMap_stType_dwIndex.insert(std::map::value_type("BACK_KNOCKDOWN", CRaceMotionData::NAME_DAMAGE_FLYING_BACK)); + s_kMap_stType_dwIndex.insert(std::map::value_type("BACK_KNOCKDOWN1", CRaceMotionData::NAME_DAMAGE_FLYING_BACK)); + s_kMap_stType_dwIndex.insert(std::map::value_type("BACK_STANDUP", CRaceMotionData::NAME_STAND_UP_BACK)); + s_kMap_stType_dwIndex.insert(std::map::value_type("BACK_STANDUP1", CRaceMotionData::NAME_STAND_UP_BACK)); + s_kMap_stType_dwIndex.insert(std::map::value_type("SPECIAL", CRaceMotionData::NAME_SPECIAL_1)); + s_kMap_stType_dwIndex.insert(std::map::value_type("SPECIAL1", CRaceMotionData::NAME_SPECIAL_2)); + s_kMap_stType_dwIndex.insert(std::map::value_type("SPECIAL2", CRaceMotionData::NAME_SPECIAL_3)); + s_kMap_stType_dwIndex.insert(std::map::value_type("SPECIAL3", CRaceMotionData::NAME_SPECIAL_4)); + s_kMap_stType_dwIndex.insert(std::map::value_type("SPECIAL4", CRaceMotionData::NAME_SPECIAL_5)); + s_kMap_stType_dwIndex.insert(std::map::value_type("SPECIAL5", CRaceMotionData::NAME_SPECIAL_6)); + s_kMap_stType_dwIndex.insert(std::map::value_type("SKILL1", CRaceMotionData::NAME_SKILL+121)); + s_kMap_stType_dwIndex.insert(std::map::value_type("SKILL2", CRaceMotionData::NAME_SKILL+122)); + s_kMap_stType_dwIndex.insert(std::map::value_type("SKILL3", CRaceMotionData::NAME_SKILL+123)); + s_kMap_stType_dwIndex.insert(std::map::value_type("SKILL4", CRaceMotionData::NAME_SKILL+124)); + s_kMap_stType_dwIndex.insert(std::map::value_type("SKILL5", CRaceMotionData::NAME_SKILL+125)); + } + + const void* pvData; + CMappedFile kMappedFile; + if (!CEterPackManager::Instance().Get(kMappedFile, motionListFileName, &pvData)) + return false; + + + CMemoryTextFileLoader kTextFileLoader; + kTextFileLoader.Bind(kMappedFile.Size(), pvData); + + rkRaceData.RegisterMotionMode(CRaceMotionData::MODE_GENERAL); + + char szMode[256]; + char szType[256]; + char szFile[256]; + int nPercent = 0; + + bool isSpawn=false; + + static std::string stSpawnMotionFileName; + static std::string stMotionFileName; + + stSpawnMotionFileName = ""; + stMotionFileName = ""; + + UINT uLineCount=kTextFileLoader.GetLineCount(); + for (UINT uLineIndex=0; uLineIndex::iterator fTypeIndex=s_kMap_stType_dwIndex.find(szType); + + if (s_kMap_stType_dwIndex.end() == fTypeIndex) + { + // 모션 목록에 WAIT, WAIT4, WAIT20 이런 식으로 등록되어 있을 때, + // WAIT4, WAIT20을 WAIT로 인식할 수 있도록 처리 + const size_t c_cutLengthLimit = 2; + bool bFound = false; + + if (c_cutLengthLimit < strlen(szType) + 1) + { + for (size_t i = 1; i <= c_cutLengthLimit; ++i) + { + std::string typeName = std::string(szType).substr(0, strlen(szType) - i); + fTypeIndex = s_kMap_stType_dwIndex.find(typeName); + + if (s_kMap_stType_dwIndex.end() != fTypeIndex) + { + bFound = true; + break; + } + } + } + + if (false == bFound) + continue; + } + + motionType = fTypeIndex->second; + + stMotionFileName = pathName; + stMotionFileName += szFile; + + rkRaceData.RegisterMotionData(CRaceMotionData::MODE_GENERAL, motionType, stMotionFileName.c_str(), nPercent); + + switch (motionType) + { + case CRaceMotionData::NAME_SPAWN: + isSpawn=true; + break; + case CRaceMotionData::NAME_DAMAGE: + stSpawnMotionFileName=stMotionFileName; + break; + } + } + + if (!isSpawn && stSpawnMotionFileName!="") + { + rkRaceData.RegisterMotionData(CRaceMotionData::MODE_GENERAL, CRaceMotionData::NAME_SPAWN, stSpawnMotionFileName.c_str(), nPercent); + } + + rkRaceData.RegisterNormalAttack(CRaceMotionData::MODE_GENERAL, CRaceMotionData::NAME_NORMAL_ATTACK); + + return true; +} + +void CRaceManager::RegisterRaceSrcName(const char * c_szName, const char * c_szSrcName) +{ + m_kMap_stRaceName_stSrcName.insert(std::map::value_type(c_szName, c_szSrcName)); +} + +void CRaceManager::RegisterRaceName(DWORD dwRaceIndex, const char * c_szName) +{ + m_kMap_dwRaceKey_stRaceName.insert(std::map::value_type(dwRaceIndex, c_szName)); +} + +void CRaceManager::CreateRace(DWORD dwRaceIndex) +{ + if (m_RaceDataMap.end() != m_RaceDataMap.find(dwRaceIndex)) + { + TraceError("RaceManager::CreateRace : Race %u already created", dwRaceIndex); + return; + } + + CRaceData * pRaceData = CRaceData::New(); + pRaceData->SetRace(dwRaceIndex); + m_RaceDataMap.insert(TRaceDataMap::value_type(dwRaceIndex, pRaceData)); + + Tracenf("CRaceManager::CreateRace(dwRaceIndex=%d)", dwRaceIndex); +} + +void CRaceManager::SelectRace(DWORD dwRaceIndex) +{ + TRaceDataIterator itor = m_RaceDataMap.find(dwRaceIndex); + if (m_RaceDataMap.end() == itor) + { + assert(!"Failed to select race data!"); + return; + } + + m_pSelectedRaceData = itor->second; +} + +CRaceData * CRaceManager::GetSelectedRaceDataPointer() +{ + return m_pSelectedRaceData; +} + +BOOL CRaceManager::GetRaceDataPointer(DWORD dwRaceIndex, CRaceData ** ppRaceData) +{ + TRaceDataIterator itor = m_RaceDataMap.find(dwRaceIndex); + + if (m_RaceDataMap.end() == itor) + { + CRaceData* pRaceData = __LoadRaceData(dwRaceIndex); + + if (pRaceData) + { + m_RaceDataMap.insert(TRaceDataMap::value_type(dwRaceIndex, pRaceData)); + *ppRaceData = pRaceData; + return TRUE; + } + + TraceError("CRaceManager::GetRaceDataPointer: cannot load data by dwRaceIndex %lu", dwRaceIndex); + return FALSE; + } + + *ppRaceData = itor->second; + return TRUE; +} + +void CRaceManager::SetPathName(const char * c_szPathName) +{ + m_strPathName = c_szPathName; +} + +const char * CRaceManager::GetFullPathFileName(const char * c_szFileName) +{ + static std::string s_stFileName; + + if (c_szFileName[0] != '.') + { + s_stFileName = m_strPathName; + s_stFileName += c_szFileName; + } + else + { + s_stFileName = c_szFileName; + } + + return s_stFileName.c_str(); +} + + +void CRaceManager::Create() +{ + CRaceMotionData::CreateSystem(2048); + CRaceData::CreateSystem(256, 512); +} + +void CRaceManager::__Initialize() +{ + m_pSelectedRaceData = NULL; +} + +void CRaceManager::__DestroyRaceDataMap() +{ + TRaceDataMap::iterator i; + for (i=m_RaceDataMap.begin(); i!=m_RaceDataMap.end(); ++i) + CRaceData::Delete(i->second); + + m_RaceDataMap.clear(); +} + +void CRaceManager::Destroy() +{ + __DestroyRaceDataMap(); + + __Initialize(); +} + +CRaceManager::CRaceManager() +{ + __Initialize(); +} + +CRaceManager::~CRaceManager() +{ + Destroy(); +} diff --git a/extension/src/port/UserInterface/InstanceBase.cpp b/extension/src/port/UserInterface/InstanceBase.cpp new file mode 100644 index 00000000..2f126dd3 --- /dev/null +++ b/extension/src/port/UserInterface/InstanceBase.cpp @@ -0,0 +1,3119 @@ +#include "StdAfx.h" +#include "InstanceBase.h" +#include "PythonBackground.h" +#include "PythonNonPlayer.h" +#include "PythonPlayer.h" +#include "PythonCharacterManager.h" +#include "AbstractPlayer.h" +#include "AbstractApplication.h" +#include "Packet.h" + +#include "../EterLib/StateManager.h" +#include "../GameLib/ItemManager.h" + +BOOL HAIR_COLOR_ENABLE=FALSE; +BOOL USE_ARMOR_SPECULAR=FALSE; +BOOL RIDE_HORSE_ENABLE=TRUE; +const float c_fDefaultRotationSpeed = 1200.0f; +const float c_fDefaultHorseRotationSpeed = 300.0f; + + +bool IsWall(unsigned race) +{ + switch (race) + { + case 14201: + case 14202: + case 14203: + case 14204: + return true; + break; + } + return false; +} + +////////////////////////////////////////////////////////////////////////////////////// + + +CInstanceBase::SHORSE::SHORSE() +{ + __Initialize(); +} + +CInstanceBase::SHORSE::~SHORSE() +{ + assert(m_pkActor==NULL); +} + +void CInstanceBase::SHORSE::__Initialize() +{ + m_isMounting=false; + m_pkActor=NULL; +} + +void CInstanceBase::SHORSE::SetAttackSpeed(UINT uAtkSpd) +{ + if (!IsMounting()) + return; + + CActorInstance& rkActor=GetActorRef(); + rkActor.SetAttackSpeed(uAtkSpd/100.0f); +} + +void CInstanceBase::SHORSE::SetMoveSpeed(UINT uMovSpd) +{ + if (!IsMounting()) + return; + + CActorInstance& rkActor=GetActorRef(); + rkActor.SetMoveSpeed(uMovSpd/100.0f); +} + +void CInstanceBase::SHORSE::Create(const TPixelPosition& c_rkPPos, UINT eRace, UINT eHitEffect) +{ + assert(NULL==m_pkActor && "CInstanceBase::SHORSE::Create - ALREADY MOUNT"); + + m_pkActor=new CActorInstance; + + CActorInstance& rkActor=GetActorRef(); + rkActor.SetEventHandler(CActorInstance::IEventHandler::GetEmptyPtr()); + if (!rkActor.SetRace(eRace)) + { + delete m_pkActor; + m_pkActor=NULL; + return; + } + + rkActor.SetShape(0); + rkActor.SetBattleHitEffect(eHitEffect); + rkActor.SetAlphaValue(0.0f); + rkActor.BlendAlphaValue(1.0f, 0.5f); + rkActor.SetMoveSpeed(1.0f); + rkActor.SetAttackSpeed(1.0f); + rkActor.SetMotionMode(CRaceMotionData::MODE_GENERAL); + rkActor.Stop(); + rkActor.RefreshActorInstance(); + + rkActor.SetCurPixelPosition(c_rkPPos); + + m_isMounting=true; +} + +void CInstanceBase::SHORSE::Destroy() +{ + if (m_pkActor) + { + m_pkActor->Destroy(); + delete m_pkActor; + } + + __Initialize(); +} + +CActorInstance& CInstanceBase::SHORSE::GetActorRef() +{ + assert(NULL!=m_pkActor && "CInstanceBase::SHORSE::GetActorRef"); + return *m_pkActor; +} + +CActorInstance* CInstanceBase::SHORSE::GetActorPtr() +{ + return m_pkActor; +} + +UINT CInstanceBase::SHORSE::GetLevel() +{ + if (m_pkActor) + { + DWORD mount = m_pkActor->GetRace(); + switch (mount) + { + case 20101: + case 20102: + case 20103: + return 1; + case 20104: + case 20105: + case 20106: + return 2; + case 20107: + case 20108: + case 20109: + case 20110: // #0000673: [M2EU] 새로운 탈것 타고 공격 안됨 + case 20111: // #0000673: [M2EU] 새로운 탈것 타고 공격 안됨 + case 20112: // #0000673: [M2EU] 새로운 탈것 타고 공격 안됨 + case 20113: // #0000673: [M2EU] 새로운 탈것 타고 공격 안됨 + case 20114: + case 20115: + case 20116: + case 20117: + case 20118: + case 20120: + case 20121: + case 20122: + case 20123: + case 20124: + case 20125: + return 3; + case 20119: // 라마단 이벤트용 흑마는 스킬불가, 공격가능한 레벨2로 설정 + case 20219: // 할로윈 이벤트용 흑마는 스킬불가, 공격가능한 레벨2로 설정 (=라마단 흑마 클론) + case 20220: + case 20221: + case 20222: + return 2; + } + + // 마운트 확장 시스템용 특수 처리 (20201 ~ 20212 대역을 사용하고 순서대로 4개씩 나눠서 초급, 중급, 고급임) + // -- 탈것 레벨을 클라에서 측정하고 공격/스킬 사용가능 여부도 클라에서 처리하는 것 자체에 문제가 있는 듯.. [hyo] + { + // 중급 탈것은 레벨2 (공격 가능, 스킬 불가) + if ((20205 <= mount && 20208 >= mount) || + (20214 == mount) || (20217 == mount) || // 난폭한 전갑순순록, 난폭한 전갑암순록 + (20224 == mount) || (20229 == mount) + ) + return 2; + + // 고급 탈것은 레벨3 (공격 가능, 스킬 가능) + if ((20209 <= mount && 20212 >= mount) || + (20215 == mount) || (20218 == mount) || // 용맹한 전갑순순록, 용맹한 전갑암순록 + (20220 == mount) || (20225 == mount) || (20230 == mount) + ) + return 3; + } + } + return 0; +} + +bool CInstanceBase::SHORSE::IsNewMount() +{ + if (!m_pkActor) + return false; + DWORD mount = m_pkActor->GetRace(); + + if ((20205 <= mount && 20208 >= mount) || + (20214 == mount) || (20217 == mount) // 난폭한 전갑순순록, 난폭한 전갑암순록 + ) + return true; + + // 고급 탈것 + if ((20209 <= mount && 20212 >= mount) || + (20215 == mount) || (20218 == mount) || // 용맹한 전갑순순록, 용맹한 전갑암순록 + (20220 == mount) + ) + return true; + + return false; +} +bool CInstanceBase::SHORSE::CanUseSkill() +{ + // 마상스킬은 말의 레벨이 3 이상이어야만 함. + if (IsMounting()) + return 2 < GetLevel(); + + return true; +} + +bool CInstanceBase::SHORSE::CanAttack() +{ + if (IsMounting()) + if (GetLevel()<=1) + return false; + + return true; +} + +bool CInstanceBase::SHORSE::IsMounting() +{ + return m_isMounting; +} + +void CInstanceBase::SHORSE::Deform() +{ + if (!IsMounting()) + return; + + CActorInstance& rkActor=GetActorRef(); + rkActor.INSTANCEBASE_Deform(); +} + +void CInstanceBase::SHORSE::Render() +{ + if (!IsMounting()) + return; + + CActorInstance& rkActor=GetActorRef(); + rkActor.Render(); +} + +void CInstanceBase::__AttachHorseSaddle() +{ + if (!IsMountingHorse()) + return; + m_kHorse.m_pkActor->AttachModelInstance(CRaceData::PART_MAIN, "saddle", m_GraphicThingInstance, CRaceData::PART_MAIN); +} + +void CInstanceBase::__DetachHorseSaddle() +{ + if (!IsMountingHorse()) + return; + m_kHorse.m_pkActor->DetachModelInstance(CRaceData::PART_MAIN, m_GraphicThingInstance, CRaceData::PART_MAIN); +} + +////////////////////////////////////////////////////////////////////////////////////// + +void CInstanceBase::BlockMovement() +{ + m_GraphicThingInstance.BlockMovement(); +} + +bool CInstanceBase::IsBlockObject(const CGraphicObjectInstance& c_rkBGObj) +{ + return m_GraphicThingInstance.IsBlockObject(c_rkBGObj); +} + +bool CInstanceBase::AvoidObject(const CGraphicObjectInstance& c_rkBGObj) +{ + return m_GraphicThingInstance.AvoidObject(c_rkBGObj); +} + +/////////////////////////////////////////////////////////////////////////////////// + +bool __ArmorVnumToShape(int iVnum, DWORD * pdwShape) +{ + *pdwShape = iVnum; + + ///////////////////////////////////////// + + if (0 == iVnum || 1 == iVnum) + return false; + + if (!USE_ARMOR_SPECULAR) + return false; + + CItemData * pItemData; + if (!CItemManager::Instance().GetItemDataPointer(iVnum, &pItemData)) + return false; + + enum + { + SHAPE_VALUE_SLOT_INDEX = 3, + }; + + *pdwShape = pItemData->GetValue(SHAPE_VALUE_SLOT_INDEX); + + return true; +} + +// 2004.07.05.myevan.궁신탄영 끼이는 문제 +class CActorInstanceBackground : public IBackground +{ + public: + CActorInstanceBackground() {} + virtual ~CActorInstanceBackground() {} + bool IsBlock(int x, int y) + { + CPythonBackground& rkBG=CPythonBackground::Instance(); + return rkBG.isAttrOn(x, y, CTerrainImpl::ATTRIBUTE_BLOCK); + } +}; + +static CActorInstanceBackground gs_kActorInstBG; + +bool CInstanceBase::LessRenderOrder(CInstanceBase* pkInst) +{ + int nMainAlpha=(__GetAlphaValue() < 1.0f) ? 1 : 0; + int nTestAlpha=(pkInst->__GetAlphaValue() < 1.0f) ? 1 : 0; + if (nMainAlpha < nTestAlpha) + return true; + if (nMainAlpha > nTestAlpha) + return false; + + if (GetRace()GetRace()) + return true; + if (GetRace()>pkInst->GetRace()) + return false; + + if (GetShape()GetShape()) + return true; + + if (GetShape()>pkInst->GetShape()) + return false; + + UINT uLeftLODLevel=__LessRenderOrder_GetLODLevel(); + UINT uRightLODLevel=pkInst->__LessRenderOrder_GetLODLevel(); + if (uLeftLODLeveluRightLODLevel) + return false; + + if (m_awPart[CRaceData::PART_WEAPON]m_awPart[CRaceData::PART_WEAPON]) + return true; + + return false; +} + +UINT CInstanceBase::__LessRenderOrder_GetLODLevel() +{ + CGrannyLODController* pLODCtrl=m_GraphicThingInstance.GetLODControllerPointer(0); + if (!pLODCtrl) + return 0; + + return pLODCtrl->GetLODLevel(); +} + +bool CInstanceBase::__Background_GetWaterHeight(const TPixelPosition& c_rkPPos, float* pfHeight) +{ + long lHeight; + if (!CPythonBackground::Instance().GetWaterHeight(int(c_rkPPos.x), int(c_rkPPos.y), &lHeight)) + return false; + + *pfHeight = float(lHeight); + + return true; +} + +bool CInstanceBase::__Background_IsWaterPixelPosition(const TPixelPosition& c_rkPPos) +{ + return CPythonBackground::Instance().isAttrOn(c_rkPPos.x, c_rkPPos.y, CTerrainImpl::ATTRIBUTE_WATER); +} + +const float PC_DUST_RANGE = 2000.0f; +const float NPC_DUST_RANGE = 1000.0f; + +DWORD CInstanceBase::ms_dwUpdateCounter=0; +DWORD CInstanceBase::ms_dwRenderCounter=0; +DWORD CInstanceBase::ms_dwDeformCounter=0; + +CDynamicPool CInstanceBase::ms_kPool; + +bool CInstanceBase::__IsInDustRange() +{ + if (!__IsExistMainInstance()) + return false; + + CInstanceBase* pkInstMain=__GetMainInstancePtr(); + + float fDistance=NEW_GetDistanceFromDestInstance(*pkInstMain); + + if (IsPC()) + { + if (fDistance<=PC_DUST_RANGE) + return true; + } + + if (fDistance<=NPC_DUST_RANGE) + return true; + + return false; +} + +void CInstanceBase::__EnableSkipCollision() +{ + if (__IsMainInstance()) + { + TraceError("CInstanceBase::__EnableSkipCollision - \300\332\275\305\300\272 \303\346\265\271\260\313\273\347\275\272\305\265\300\314 \265\307\270\351 \276\310\265\310\264\331!!"); + return; + } + m_GraphicThingInstance.EnableSkipCollision(); +} + +void CInstanceBase::__DisableSkipCollision() +{ + m_GraphicThingInstance.DisableSkipCollision(); +} + +DWORD CInstanceBase::__GetShadowMapColor(float x, float y) +{ + CPythonBackground& rkBG=CPythonBackground::Instance(); + return rkBG.GetShadowMapColor(x, y); +} + +float CInstanceBase::__GetBackgroundHeight(float x, float y) +{ + CPythonBackground& rkBG=CPythonBackground::Instance(); + return rkBG.GetHeight(x, y); +} + +#ifdef __MOVIE_MODE__ + +BOOL CInstanceBase::IsMovieMode() +{ + if (IsAffect(AFFECT_INVISIBILITY)) + return true; + + return false; +} + +#endif + +BOOL CInstanceBase::IsInvisibility() +{ + if (IsAffect(AFFECT_INVISIBILITY)) + return true; + + return false; +} + +BOOL CInstanceBase::IsParalysis() +{ + return m_GraphicThingInstance.IsParalysis(); +} + +BOOL CInstanceBase::IsGameMaster() +{ + if (m_kAffectFlagContainer.IsSet(AFFECT_YMIR)) + return true; + return false; +} + + +BOOL CInstanceBase::IsSameEmpire(CInstanceBase& rkInstDst) +{ + if (0 == rkInstDst.m_dwEmpireID) + return TRUE; + + if (IsGameMaster()) + return TRUE; + + if (rkInstDst.IsGameMaster()) + return TRUE; + + if (rkInstDst.m_dwEmpireID==m_dwEmpireID) + return TRUE; + + return FALSE; +} + +DWORD CInstanceBase::GetEmpireID() +{ + return m_dwEmpireID; +} + +DWORD CInstanceBase::GetGuildID() +{ + return m_dwGuildID; +} + +int CInstanceBase::GetAlignment() +{ + return m_sAlignment; +} + +UINT CInstanceBase::GetAlignmentGrade() +{ + if (m_sAlignment >= 12000) + return 0; + else if (m_sAlignment >= 8000) + return 1; + else if (m_sAlignment >= 4000) + return 2; + else if (m_sAlignment >= 1000) + return 3; + else if (m_sAlignment >= 0) + return 4; + else if (m_sAlignment > -4000) + return 5; + else if (m_sAlignment > -8000) + return 6; + else if (m_sAlignment > -12000) + return 7; + + return 8; +} + +int CInstanceBase::GetAlignmentType() +{ + switch (GetAlignmentGrade()) + { + case 0: + case 1: + case 2: + case 3: + { + return ALIGNMENT_TYPE_WHITE; + break; + } + + case 5: + case 6: + case 7: + case 8: + { + return ALIGNMENT_TYPE_DARK; + break; + } + } + + return ALIGNMENT_TYPE_NORMAL; +} + +BYTE CInstanceBase::GetPKMode() +{ + return m_byPKMode; +} + +bool CInstanceBase::IsKiller() +{ + return m_isKiller; +} + +bool CInstanceBase::IsPartyMember() +{ + return m_isPartyMember; +} + +BOOL CInstanceBase::IsInSafe() +{ + const TPixelPosition& c_rkPPosCur=m_GraphicThingInstance.NEW_GetCurPixelPositionRef(); + if (CPythonBackground::Instance().isAttrOn(c_rkPPosCur.x, c_rkPPosCur.y, CTerrainImpl::ATTRIBUTE_BANPK)) + return TRUE; + + return FALSE; +} + +float CInstanceBase::CalculateDistanceSq3d(const TPixelPosition& c_rkPPosDst) +{ + const TPixelPosition& c_rkPPosSrc=m_GraphicThingInstance.NEW_GetCurPixelPositionRef(); + return SPixelPosition_CalculateDistanceSq3d(c_rkPPosSrc, c_rkPPosDst); +} + +void CInstanceBase::OnSelected() +{ +#ifdef __MOVIE_MODE__ + if (!__IsExistMainInstance()) + return; +#endif + + if (IsStoneDoor()) + return; + + if (IsDead()) + return; + + __AttachSelectEffect(); +} + +void CInstanceBase::OnUnselected() +{ + __DetachSelectEffect(); +} + +void CInstanceBase::OnTargeted() +{ +#ifdef __MOVIE_MODE__ + if (!__IsExistMainInstance()) + return; +#endif + + if (IsStoneDoor()) + return; + + if (IsDead()) + return; + + __AttachTargetEffect(); +} + +void CInstanceBase::OnUntargeted() +{ + __DetachTargetEffect(); +} + +void CInstanceBase::DestroySystem() +{ + ms_kPool.Clear(); +} + +void CInstanceBase::CreateSystem(UINT uCapacity) +{ + ms_kPool.Create(uCapacity); + + memset(ms_adwCRCAffectEffect, 0, sizeof(ms_adwCRCAffectEffect)); + + ms_fDustGap=250.0f; + ms_fHorseDustGap=500.0f; +} + +CInstanceBase* CInstanceBase::New() +{ + return ms_kPool.Alloc(); +} + +void CInstanceBase::Delete(CInstanceBase* pkInst) +{ + pkInst->Destroy(); + ms_kPool.Free(pkInst); +} + +void CInstanceBase::SetMainInstance() +{ + CPythonCharacterManager& rkChrMgr=CPythonCharacterManager::Instance(); + + DWORD dwVID=GetVirtualID(); + rkChrMgr.SetMainInstance(dwVID); + + m_GraphicThingInstance.SetMainInstance(); +} + +CInstanceBase* CInstanceBase::__GetMainInstancePtr() +{ + CPythonCharacterManager& rkChrMgr=CPythonCharacterManager::Instance(); + return rkChrMgr.GetMainInstancePtr(); +} + +void CInstanceBase::__ClearMainInstance() +{ + CPythonCharacterManager& rkChrMgr=CPythonCharacterManager::Instance(); + rkChrMgr.ClearMainInstance(); +} + +/* 실제 플레이어 캐릭터인지 조사.*/ +bool CInstanceBase::__IsMainInstance() +{ + if (this==__GetMainInstancePtr()) + return true; + + return false; +} + +bool CInstanceBase::__IsExistMainInstance() +{ + if(__GetMainInstancePtr()) + return true; + else + return false; +} + +bool CInstanceBase::__MainCanSeeHiddenThing() +{ + return false; +// CInstanceBase * pInstance = __GetMainInstancePtr(); +// return pInstance->IsAffect(AFFECT_GAMJI); +} + +float CInstanceBase::__GetBowRange() +{ + float fRange = 2500.0f - 100.0f; + + if (__IsMainInstance()) + { + IAbstractPlayer& rPlayer=IAbstractPlayer::GetSingleton(); + fRange += float(rPlayer.GetStatus(POINT_BOW_DISTANCE)); + } + + return fRange; +} + +CInstanceBase* CInstanceBase::__FindInstancePtr(DWORD dwVID) +{ + CPythonCharacterManager& rkChrMgr=CPythonCharacterManager::Instance(); + return rkChrMgr.GetInstancePtr(dwVID); +} + +bool CInstanceBase::__FindRaceType(DWORD dwRace, BYTE* pbType) +{ + CPythonNonPlayer& rkNonPlayer=CPythonNonPlayer::Instance(); + return rkNonPlayer.GetInstanceType(dwRace, pbType); +} + +bool CInstanceBase::Create(const SCreateData& c_rkCreateData) +{ + IAbstractApplication::GetSingleton().SkipRenderBuffering(300); + + SetInstanceType(c_rkCreateData.m_bType); + + + if (!SetRace(c_rkCreateData.m_dwRace)) + return false; + + SetVirtualID(c_rkCreateData.m_dwVID); + + if (c_rkCreateData.m_isMain) + SetMainInstance(); + + if (IsGuildWall()) + { + unsigned center_x; + unsigned center_y; + + c_rkCreateData.m_kAffectFlags.ConvertToPosition(¢er_x, ¢er_y); + + float center_z = __GetBackgroundHeight(center_x, center_y); + NEW_SetPixelPosition(TPixelPosition(float(c_rkCreateData.m_lPosX), float(c_rkCreateData.m_lPosY), center_z)); + } + else + { + SCRIPT_SetPixelPosition(float(c_rkCreateData.m_lPosX), float(c_rkCreateData.m_lPosY)); + } + + if (0 != c_rkCreateData.m_dwMountVnum) + MountHorse(c_rkCreateData.m_dwMountVnum); + + SetArmor(c_rkCreateData.m_dwArmor); + + if (IsPC()) + { + SetHair(c_rkCreateData.m_dwHair); + SetWeapon(c_rkCreateData.m_dwWeapon); + } + + __Create_SetName(c_rkCreateData); + + m_dwLevel = c_rkCreateData.m_dwLevel; + m_dwGuildID = c_rkCreateData.m_dwGuildID; + m_dwEmpireID = c_rkCreateData.m_dwEmpireID; + + SetVirtualNumber(c_rkCreateData.m_dwRace); + SetRotation(c_rkCreateData.m_fRot); + + SetAlignment(c_rkCreateData.m_sAlignment); + SetPKMode(c_rkCreateData.m_byPKMode); + + SetMoveSpeed(c_rkCreateData.m_dwMovSpd); + SetAttackSpeed(c_rkCreateData.m_dwAtkSpd); + + // NOTE : Dress 를 입고 있으면 Alpha 를 넣지 않는다. + if (!IsWearingDress()) + { + // NOTE : 반드시 Affect 셋팅 윗쪽에 있어야 함 + m_GraphicThingInstance.SetAlphaValue(0.0f); + m_GraphicThingInstance.BlendAlphaValue(1.0f, 0.5f); + } + + if (!IsGuildWall()) + { + SetAffectFlagContainer(c_rkCreateData.m_kAffectFlags); + } + + // NOTE : 반드시 Affect 셋팅 후에 해야 함 + AttachTextTail(); + RefreshTextTail(); + + if (c_rkCreateData.m_dwStateFlags & ADD_CHARACTER_STATE_SPAWN) + { + if (IsAffect(AFFECT_SPAWN)) + __AttachEffect(EFFECT_SPAWN_APPEAR); + + if (IsPC()) + { + Refresh(CRaceMotionData::NAME_WAIT, true); + } + else + { + Refresh(CRaceMotionData::NAME_SPAWN, false); + } + } + else + { + Refresh(CRaceMotionData::NAME_WAIT, true); + } + + __AttachEmpireEffect(c_rkCreateData.m_dwEmpireID); + + RegisterBoundingSphere(); + + if (c_rkCreateData.m_dwStateFlags & ADD_CHARACTER_STATE_DEAD) + m_GraphicThingInstance.DieEnd(); + + SetStateFlags(c_rkCreateData.m_dwStateFlags); + + m_GraphicThingInstance.SetBattleHitEffect(ms_adwCRCAffectEffect[EFFECT_HIT]); + + if (!IsPC()) + { + DWORD dwBodyColor = CPythonNonPlayer::Instance().GetMonsterColor(c_rkCreateData.m_dwRace); + if (0 != dwBodyColor) + { + SetModulateRenderMode(); + SetAddColor(dwBodyColor); + } + } + + __AttachHorseSaddle(); + + // 길드 심볼을 위한 임시 코드, 적정 위치를 찾는 중 + const int c_iGuildSymbolRace = 14200; + if (c_iGuildSymbolRace == GetRace()) + { + std::string strFileName = GetGuildSymbolFileName(m_dwGuildID); + if (IsFile(strFileName.c_str())) + m_GraphicThingInstance.ChangeMaterial(strFileName.c_str()); + } + + return true; +} + + +void CInstanceBase::__Create_SetName(const SCreateData& c_rkCreateData) +{ + if (IsGoto()) + { + SetNameString("", 0); + return; + } + if (IsWarp()) + { + __Create_SetWarpName(c_rkCreateData); + return; + } + + SetNameString(c_rkCreateData.m_stName.c_str(), c_rkCreateData.m_stName.length()); +} + +void CInstanceBase::__Create_SetWarpName(const SCreateData& c_rkCreateData) +{ + const char * c_szName; + if (CPythonNonPlayer::Instance().GetName(c_rkCreateData.m_dwRace, &c_szName)) + { + std::string strName = c_szName; + int iFindingPos = strName.find_first_of(" ", 0); + if (iFindingPos > 0) + { + strName.resize(iFindingPos); + } + SetNameString(strName.c_str(), strName.length()); + } + else + { + SetNameString(c_rkCreateData.m_stName.c_str(), c_rkCreateData.m_stName.length()); + } +} + +void CInstanceBase::SetNameString(const char* c_szName, int len) +{ + m_stName.assign(c_szName, len); +} + + +bool CInstanceBase::SetRace(DWORD eRace) +{ + m_dwRace = eRace; + + if (!m_GraphicThingInstance.SetRace(eRace)) + return false; + + if (!__FindRaceType(m_dwRace, &m_eRaceType)) + m_eRaceType=CActorInstance::TYPE_PC; + + return true; +} + +BOOL CInstanceBase::__IsChangableWeapon(int iWeaponID) +{ + // 드레스 입고 있을때는 부케외의 장비는 나오지 않게.. + if (IsWearingDress()) + { + const int c_iBouquets[] = + { + 50201, // Bouquet for Assassin + 50202, // Bouquet for Shaman + 50203, + 50204, + 0, // #0000545: [M2CN] 웨딩 드레스와 장비 착용 문제 + }; + + for (int i = 0; c_iBouquets[i] != 0; ++i) + if (iWeaponID == c_iBouquets[i]) + return true; + + return false; + } + else + return true; +} + +BOOL CInstanceBase::IsWearingDress() +{ + const int c_iWeddingDressShape = 201; + return c_iWeddingDressShape == m_eShape; +} + +BOOL CInstanceBase::IsHoldingPickAxe() +{ + const int c_iPickAxeStart = 29101; + const int c_iPickAxeEnd = 29110; + return m_awPart[CRaceData::PART_WEAPON] >= c_iPickAxeStart && m_awPart[CRaceData::PART_WEAPON] <= c_iPickAxeEnd; +} + +BOOL CInstanceBase::IsNewMount() +{ + return m_kHorse.IsNewMount(); +} + +BOOL CInstanceBase::IsMountingHorse() +{ + return m_kHorse.IsMounting(); +} + +void CInstanceBase::MountHorse(UINT eRace) +{ + m_kHorse.Destroy(); + m_kHorse.Create(m_GraphicThingInstance.NEW_GetCurPixelPositionRef(), eRace, ms_adwCRCAffectEffect[EFFECT_HIT]); + + SetMotionMode(CRaceMotionData::MODE_HORSE); + SetRotationSpeed(c_fDefaultHorseRotationSpeed); + + m_GraphicThingInstance.MountHorse(m_kHorse.GetActorPtr()); + m_GraphicThingInstance.Stop(); + m_GraphicThingInstance.RefreshActorInstance(); +} + +void CInstanceBase::DismountHorse() +{ + m_kHorse.Destroy(); +} + +void CInstanceBase::GetInfo(std::string* pstInfo) +{ + char szInfo[256]; + sprintf(szInfo, "Inst - UC %d, RC %d Pool - %d ", + ms_dwUpdateCounter, + ms_dwRenderCounter, + ms_kPool.GetCapacity() + ); + + pstInfo->append(szInfo); +} + +void CInstanceBase::ResetPerformanceCounter() +{ + ms_dwUpdateCounter=0; + ms_dwRenderCounter=0; + ms_dwDeformCounter=0; +} + +bool CInstanceBase::NEW_IsLastPixelPosition() +{ + return m_GraphicThingInstance.IsPushing(); +} + +const TPixelPosition& CInstanceBase::NEW_GetLastPixelPositionRef() +{ + return m_GraphicThingInstance.NEW_GetLastPixelPositionRef(); +} + +void CInstanceBase::NEW_SetDstPixelPositionZ(FLOAT z) +{ + m_GraphicThingInstance.NEW_SetDstPixelPositionZ(z); +} + +void CInstanceBase::NEW_SetDstPixelPosition(const TPixelPosition& c_rkPPosDst) +{ + m_GraphicThingInstance.NEW_SetDstPixelPosition(c_rkPPosDst); +} + +void CInstanceBase::NEW_SetSrcPixelPosition(const TPixelPosition& c_rkPPosSrc) +{ + m_GraphicThingInstance.NEW_SetSrcPixelPosition(c_rkPPosSrc); +} + +const TPixelPosition& CInstanceBase::NEW_GetCurPixelPositionRef() +{ + return m_GraphicThingInstance.NEW_GetCurPixelPositionRef(); +} + +const TPixelPosition& CInstanceBase::NEW_GetDstPixelPositionRef() +{ + return m_GraphicThingInstance.NEW_GetDstPixelPositionRef(); +} + +const TPixelPosition& CInstanceBase::NEW_GetSrcPixelPositionRef() +{ + return m_GraphicThingInstance.NEW_GetSrcPixelPositionRef(); +} + +///////////////////////////////////////////////////////////////////////////////////////////////// +void CInstanceBase::OnSyncing() +{ + m_GraphicThingInstance.__OnSyncing(); +} + +void CInstanceBase::OnWaiting() +{ + m_GraphicThingInstance.__OnWaiting(); +} + +void CInstanceBase::OnMoving() +{ + m_GraphicThingInstance.__OnMoving(); +} + +void CInstanceBase::ChangeGuild(DWORD dwGuildID) +{ + m_dwGuildID=dwGuildID; + + DetachTextTail(); + AttachTextTail(); + RefreshTextTail(); +} + +DWORD CInstanceBase::GetPart(CRaceData::EParts part) +{ + assert(part >= 0 && part < CRaceData::PART_MAX_NUM); + return m_awPart[part]; +} + +DWORD CInstanceBase::GetShape() +{ + return m_eShape; +} + +bool CInstanceBase::CanAct() +{ + return m_GraphicThingInstance.CanAct(); +} + +bool CInstanceBase::CanMove() +{ + return m_GraphicThingInstance.CanMove(); +} + +bool CInstanceBase::CanUseSkill() +{ + if (IsPoly()) + return false; + + if (IsWearingDress()) + return false; + + if (IsHoldingPickAxe()) + return false; + + if (!m_kHorse.CanUseSkill()) + return false; + + if (!m_GraphicThingInstance.CanUseSkill()) + return false; + + return true; +} + +bool CInstanceBase::CanAttack() +{ + if (!m_kHorse.CanAttack()) + return false; + + if (IsWearingDress()) + return false; + + if (IsHoldingPickAxe()) + return false; + + return m_GraphicThingInstance.CanAttack(); +} + + + +bool CInstanceBase::CanFishing() +{ + return m_GraphicThingInstance.CanFishing(); +} + + +BOOL CInstanceBase::IsBowMode() +{ + return m_GraphicThingInstance.IsBowMode(); +} + +BOOL CInstanceBase::IsHandMode() +{ + return m_GraphicThingInstance.IsHandMode(); +} + +BOOL CInstanceBase::IsFishingMode() +{ + if (CRaceMotionData::MODE_FISHING == m_GraphicThingInstance.GetMotionMode()) + return true; + + return false; +} + +BOOL CInstanceBase::IsFishing() +{ + return m_GraphicThingInstance.IsFishing(); +} + +BOOL CInstanceBase::IsDead() +{ + return m_GraphicThingInstance.IsDead(); +} + +BOOL CInstanceBase::IsStun() +{ + return m_GraphicThingInstance.IsStun(); +} + +BOOL CInstanceBase::IsSleep() +{ + return m_GraphicThingInstance.IsSleep(); +} + + +BOOL CInstanceBase::__IsSyncing() +{ + return m_GraphicThingInstance.__IsSyncing(); +} + + + +void CInstanceBase::NEW_SetOwner(DWORD dwVIDOwner) +{ + m_GraphicThingInstance.SetOwner(dwVIDOwner); +} + +float CInstanceBase::GetLocalTime() +{ + return m_GraphicThingInstance.GetLocalTime(); +} + + +void CInstanceBase::PushUDPState(DWORD dwCmdTime, const TPixelPosition& c_rkPPosDst, float fDstRot, UINT eFunc, UINT uArg) +{ +} + +DWORD ELTimer_GetServerFrameMSec(); + +void CInstanceBase::PushTCPStateExpanded(DWORD dwCmdTime, const TPixelPosition& c_rkPPosDst, float fDstRot, UINT eFunc, UINT uArg, UINT uTargetVID) +{ + SCommand kCmdNew; + kCmdNew.m_kPPosDst = c_rkPPosDst; + kCmdNew.m_dwChkTime = dwCmdTime+100; + kCmdNew.m_dwCmdTime = dwCmdTime; + kCmdNew.m_fDstRot = fDstRot; + kCmdNew.m_eFunc = eFunc; + kCmdNew.m_uArg = uArg; + kCmdNew.m_uTargetVID = uTargetVID; + m_kQue_kCmdNew.push_back(kCmdNew); +} + +void CInstanceBase::PushTCPState(DWORD dwCmdTime, const TPixelPosition& c_rkPPosDst, float fDstRot, UINT eFunc, UINT uArg) +{ + if (__IsMainInstance()) + { + //assert(!"CInstanceBase::PushTCPState 플레이어 자신에게 이동패킷은 오면 안된다!"); + TraceError("CInstanceBase::PushTCPState \307\303\267\271\300\314\276\356 \300\332\275\305\277\241\260\324 \300\314\265\277\306\320\305\266\300\272 \277\300\270\351 \276\310\265\310\264\331!"); + return; + } + + int nNetworkGap=ELTimer_GetServerFrameMSec()-dwCmdTime; + + m_nAverageNetworkGap=(m_nAverageNetworkGap*70+nNetworkGap*30)/100; + + /* + if (m_dwBaseCmdTime == 0) + { + m_dwBaseChkTime = ELTimer_GetFrameMSec()-nNetworkGap; + m_dwBaseCmdTime = dwCmdTime; + + Tracenf("VID[%d] 네트웍갭 [%d]", GetVirtualID(), nNetworkGap); + } + */ + + //m_dwBaseChkTime-m_dwBaseCmdTime+ELTimer_GetServerMSec(); + + SCommand kCmdNew; + kCmdNew.m_kPPosDst = c_rkPPosDst; + kCmdNew.m_dwChkTime = dwCmdTime+m_nAverageNetworkGap;//m_dwBaseChkTime + (dwCmdTime - m_dwBaseCmdTime);// + nNetworkGap; + kCmdNew.m_dwCmdTime = dwCmdTime; + kCmdNew.m_fDstRot = fDstRot; + kCmdNew.m_eFunc = eFunc; + kCmdNew.m_uArg = uArg; + m_kQue_kCmdNew.push_back(kCmdNew); + + //int nApplyGap=kCmdNew.m_dwChkTime-ELTimer_GetServerFrameMSec(); + + //if (nApplyGap<-500 || nApplyGap>500) + // Tracenf("VID[%d] NAME[%s] 네트웍갭 [cur:%d ave:%d] 작동시간 (%d)", GetVirtualID(), GetNameString(), nNetworkGap, m_nAverageNetworkGap, nApplyGap); +} + +/* +CInstanceBase::TStateQueue::iterator CInstanceBase::FindSameState(TStateQueue& rkQuekStt, DWORD dwCmdTime, UINT eFunc, UINT uArg) +{ + TStateQueue::iterator i=rkQuekStt.begin(); + while (rkQuekStt.end()!=i) + { + SState& rkSttEach=*i; + if (rkSttEach.m_dwCmdTime==dwCmdTime) + if (rkSttEach.m_eFunc==eFunc) + if (rkSttEach.m_uArg==uArg) + break; + ++i; + } + + return i; +} +*/ + +BOOL CInstanceBase::__CanProcessNetworkStatePacket() +{ + if (m_GraphicThingInstance.IsDead()) + return FALSE; + if (m_GraphicThingInstance.IsKnockDown()) + return FALSE; + if (m_GraphicThingInstance.IsUsingSkill()) + if (!m_GraphicThingInstance.CanCancelSkill()) + return FALSE; + + return TRUE; +} + +BOOL CInstanceBase::__IsEnableTCPProcess(UINT eCurFunc) +{ + if (m_GraphicThingInstance.IsActEmotion()) + { + return FALSE; + } + + if (!m_bEnableTCPState) + { + if (FUNC_EMOTION != eCurFunc) + { + return FALSE; + } + } + + return TRUE; +} + +void CInstanceBase::StateProcess() +{ + while (1) + { + if (m_kQue_kCmdNew.empty()) + return; + + DWORD dwDstChkTime = m_kQue_kCmdNew.front().m_dwChkTime; + DWORD dwCurChkTime = ELTimer_GetServerFrameMSec(); + + if (dwCurChkTime < dwDstChkTime) + return; + + SCommand kCmdTop = m_kQue_kCmdNew.front(); + m_kQue_kCmdNew.pop_front(); + + TPixelPosition kPPosDst = kCmdTop.m_kPPosDst; + //DWORD dwCmdTime = kCmdTop.m_dwCmdTime; + FLOAT fRotDst = kCmdTop.m_fDstRot; + UINT eFunc = kCmdTop.m_eFunc; + UINT uArg = kCmdTop.m_uArg; + UINT uVID = GetVirtualID(); + UINT uTargetVID = kCmdTop.m_uTargetVID; + + TPixelPosition kPPosCur; + NEW_GetPixelPosition(&kPPosCur); + + /* + if (IsPC()) + Tracenf("%d cmd: vid=%d[%s] func=%d arg=%d curPos=(%f, %f) dstPos=(%f, %f) rot=%f (time %d)", + ELTimer_GetMSec(), + uVID, m_stName.c_str(), eFunc, uArg, + kPPosCur.x, kPPosCur.y, + kPPosDst.x, kPPosDst.y, fRotDst, dwCmdTime-m_dwBaseCmdTime); + */ + + TPixelPosition kPPosDir = kPPosDst - kPPosCur; + float fDirLen = (float)sqrt(kPPosDir.x * kPPosDir.x + kPPosDir.y * kPPosDir.y); + + //Tracenf("거리 %f", fDirLen); + + if (!__CanProcessNetworkStatePacket()) + { + Lognf(0, "vid=%d \277\362\301\367\300\317 \274\366 \276\370\264\302 \273\363\305\302\266\363 \275\272\305\265 IsDead=%d, IsKnockDown=%d", uVID, m_GraphicThingInstance.IsDead(), m_GraphicThingInstance.IsKnockDown()); + return; + } + + if (!__IsEnableTCPProcess(eFunc)) + { + return; + } + + switch (eFunc) + { + case FUNC_WAIT: + { + //Tracenf("%s (%f, %f) -> (%f, %f) 남은거리 %f", GetNameString(), kPPosCur.x, kPPosCur.y, kPPosDst.x, kPPosDst.y, fDirLen); + if (fDirLen > 1.0f) + { + //NEW_GetSrcPixelPositionRef() = kPPosCur; + //NEW_GetDstPixelPositionRef() = kPPosDst; + NEW_SetSrcPixelPosition(kPPosCur); + NEW_SetDstPixelPosition(kPPosDst); + + __EnableSkipCollision(); + + m_fDstRot = fRotDst; + m_isGoing = TRUE; + + m_kMovAfterFunc.eFunc = FUNC_WAIT; + + if (!IsWalking()) + StartWalking(); + + //Tracen("목표정지"); + } + else + { + //Tracen("현재 정지"); + + m_isGoing = FALSE; + + if (!IsWaiting()) + EndWalking(); + + SCRIPT_SetPixelPosition(kPPosDst.x, kPPosDst.y); + SetAdvancingRotation(fRotDst); + SetRotation(fRotDst); + } + break; + } + + case FUNC_MOVE: + { + //NEW_GetSrcPixelPositionRef() = kPPosCur; + //NEW_GetDstPixelPositionRef() = kPPosDst; + NEW_SetSrcPixelPosition(kPPosCur); + NEW_SetDstPixelPosition(kPPosDst); + m_fDstRot = fRotDst; + m_isGoing = TRUE; + __EnableSkipCollision(); + //m_isSyncMov = TRUE; + + m_kMovAfterFunc.eFunc = FUNC_MOVE; + + if (!IsWalking()) + { + //Tracen("걷고 있지 않아 걷기 시작"); + StartWalking(); + } + else + { + //Tracen("이미 걷는중 "); + } + break; + } + + case FUNC_COMBO: + { + if (fDirLen >= 50.0f) + { + NEW_SetSrcPixelPosition(kPPosCur); + NEW_SetDstPixelPosition(kPPosDst); + m_fDstRot=fRotDst; + m_isGoing = TRUE; + __EnableSkipCollision(); + + m_kMovAfterFunc.eFunc = FUNC_COMBO; + m_kMovAfterFunc.uArg = uArg; + + if (!IsWalking()) + StartWalking(); + } + else + { + //Tracen("대기 공격 정지"); + + m_isGoing = FALSE; + + if (IsWalking()) + EndWalking(); + + SCRIPT_SetPixelPosition(kPPosDst.x, kPPosDst.y); + RunComboAttack(fRotDst, uArg); + } + break; + } + + case FUNC_ATTACK: + { + if (fDirLen>=50.0f) + { + //NEW_GetSrcPixelPositionRef() = kPPosCur; + //NEW_GetDstPixelPositionRef() = kPPosDst; + NEW_SetSrcPixelPosition(kPPosCur); + NEW_SetDstPixelPosition(kPPosDst); + m_fDstRot = fRotDst; + m_isGoing = TRUE; + __EnableSkipCollision(); + //m_isSyncMov = TRUE; + + m_kMovAfterFunc.eFunc = FUNC_ATTACK; + + if (!IsWalking()) + StartWalking(); + + //Tracen("너무 멀어서 이동 후 공격"); + } + else + { + //Tracen("노말 공격 정지"); + + m_isGoing = FALSE; + + if (IsWalking()) + EndWalking(); + + SCRIPT_SetPixelPosition(kPPosDst.x, kPPosDst.y); + BlendRotation(fRotDst); + + RunNormalAttack(fRotDst); + + //Tracen("가깝기 때문에 워프 공격"); + } + break; + } + + case FUNC_MOB_SKILL: + { + if (fDirLen >= 50.0f) + { + NEW_SetSrcPixelPosition(kPPosCur); + NEW_SetDstPixelPosition(kPPosDst); + m_fDstRot = fRotDst; + m_isGoing = TRUE; + __EnableSkipCollision(); + + m_kMovAfterFunc.eFunc = FUNC_MOB_SKILL; + m_kMovAfterFunc.uArg = uArg; + + if (!IsWalking()) + StartWalking(); + } + else + { + m_isGoing = FALSE; + + if (IsWalking()) + EndWalking(); + + SCRIPT_SetPixelPosition(kPPosDst.x, kPPosDst.y); + BlendRotation(fRotDst); + + m_GraphicThingInstance.InterceptOnceMotion(CRaceMotionData::NAME_SPECIAL_1 + uArg); + } + break; + } + + case FUNC_EMOTION: + { + if (fDirLen>100.0f) + { + NEW_SetSrcPixelPosition(kPPosCur); + NEW_SetDstPixelPosition(kPPosDst); + m_fDstRot = fRotDst; + m_isGoing = TRUE; + + if (__IsMainInstance()) + __EnableSkipCollision(); + + m_kMovAfterFunc.eFunc = FUNC_EMOTION; + m_kMovAfterFunc.uArg = uArg; + m_kMovAfterFunc.uArgExpanded = uTargetVID; + m_kMovAfterFunc.kPosDst = kPPosDst; + + if (!IsWalking()) + StartWalking(); + } + else + { + __ProcessFunctionEmotion(uArg, uTargetVID, kPPosDst); + } + break; + } + + default: + { + if (eFunc & FUNC_SKILL) + { + if (fDirLen >= 50.0f) + { + //NEW_GetSrcPixelPositionRef() = kPPosCur; + //NEW_GetDstPixelPositionRef() = kPPosDst; + NEW_SetSrcPixelPosition(kPPosCur); + NEW_SetDstPixelPosition(kPPosDst); + m_fDstRot = fRotDst; + m_isGoing = TRUE; + //m_isSyncMov = TRUE; + __EnableSkipCollision(); + + m_kMovAfterFunc.eFunc = eFunc; + m_kMovAfterFunc.uArg = uArg; + + if (!IsWalking()) + StartWalking(); + + //Tracen("너무 멀어서 이동 후 공격"); + } + else + { + //Tracen("스킬 정지"); + + m_isGoing = FALSE; + + if (IsWalking()) + EndWalking(); + + SCRIPT_SetPixelPosition(kPPosDst.x, kPPosDst.y); + SetAdvancingRotation(fRotDst); + SetRotation(fRotDst); + + NEW_UseSkill(0, eFunc & 0x7f, uArg&0x0f, (uArg>>4) ? true : false); + //Tracen("가깝기 때문에 워프 공격"); + } + } + break; + } + } + } +} + + +void CInstanceBase::MovementProcess() +{ + TPixelPosition kPPosCur; + NEW_GetPixelPosition(&kPPosCur); + + // 렌더링 좌표계이므로 y를 -화해서 더한다. + + TPixelPosition kPPosNext; + { + const D3DXVECTOR3 & c_rkV3Mov = m_GraphicThingInstance.GetMovementVectorRef(); + + kPPosNext.x = kPPosCur.x + (+c_rkV3Mov.x); + kPPosNext.y = kPPosCur.y + (-c_rkV3Mov.y); + kPPosNext.z = kPPosCur.z + (+c_rkV3Mov.z); + } + + TPixelPosition kPPosDeltaSC = kPPosCur - NEW_GetSrcPixelPositionRef(); + TPixelPosition kPPosDeltaSN = kPPosNext - NEW_GetSrcPixelPositionRef(); + TPixelPosition kPPosDeltaSD = NEW_GetDstPixelPositionRef() - NEW_GetSrcPixelPositionRef(); + + float fCurLen = sqrtf(kPPosDeltaSC.x * kPPosDeltaSC.x + kPPosDeltaSC.y * kPPosDeltaSC.y); + float fNextLen = sqrtf(kPPosDeltaSN.x * kPPosDeltaSN.x + kPPosDeltaSN.y * kPPosDeltaSN.y); + float fTotalLen = sqrtf(kPPosDeltaSD.x * kPPosDeltaSD.x + kPPosDeltaSD.y * kPPosDeltaSD.y); + float fRestLen = fTotalLen - fCurLen; + + if (__IsMainInstance()) + { + if (m_isGoing && IsWalking()) + { + float fDstRot = NEW_GetAdvancingRotationFromPixelPosition(NEW_GetSrcPixelPositionRef(), NEW_GetDstPixelPositionRef()); + + SetAdvancingRotation(fDstRot); + + if (fRestLen<=0.0) + { + if (IsWalking()) + EndWalking(); + + //Tracen("목표 도달 정지"); + + m_isGoing = FALSE; + + BlockMovement(); + + if (FUNC_EMOTION == m_kMovAfterFunc.eFunc) + { + DWORD dwMotionNumber = m_kMovAfterFunc.uArg; + DWORD dwTargetVID = m_kMovAfterFunc.uArgExpanded; + __ProcessFunctionEmotion(dwMotionNumber, dwTargetVID, m_kMovAfterFunc.kPosDst); + m_kMovAfterFunc.eFunc = FUNC_WAIT; + return; + } + } + } + } + else + { + if (m_isGoing && IsWalking()) + { + float fDstRot = NEW_GetAdvancingRotationFromPixelPosition(NEW_GetSrcPixelPositionRef(), NEW_GetDstPixelPositionRef()); + + SetAdvancingRotation(fDstRot); + + // 만약 렌턴시가 늦어 너무 많이 이동했다면.. + if (fRestLen < -100.0f) + { + NEW_SetSrcPixelPosition(kPPosCur); + + float fDstRot = NEW_GetAdvancingRotationFromPixelPosition(kPPosCur, NEW_GetDstPixelPositionRef()); + SetAdvancingRotation(fDstRot); + //Tracenf("VID %d 오버 방향설정 (%f, %f) %f rest %f", GetVirtualID(), kPPosCur.x, kPPosCur.y, fDstRot, fRestLen); + + // 이동중이라면 다음번에 멈추게 한다 + if (FUNC_MOVE == m_kMovAfterFunc.eFunc) + { + m_kMovAfterFunc.eFunc = FUNC_WAIT; + } + } + // 도착했다면... + else if (fCurLen <= fTotalLen && fTotalLen <= fNextLen) + { + if (m_GraphicThingInstance.IsDead() || m_GraphicThingInstance.IsKnockDown()) + { + __DisableSkipCollision(); + + //Tracen("사망 상태라 동작 스킵"); + + m_isGoing = FALSE; + + //Tracen("행동 불능 상태라 이후 동작 스킵"); + } + else + { + switch (m_kMovAfterFunc.eFunc) + { + case FUNC_ATTACK: + { + if (IsWalking()) + EndWalking(); + + __DisableSkipCollision(); + m_isGoing = FALSE; + + BlockMovement(); + SCRIPT_SetPixelPosition(NEW_GetDstPixelPositionRef().x, NEW_GetDstPixelPositionRef().y); + SetAdvancingRotation(m_fDstRot); + SetRotation(m_fDstRot); + + RunNormalAttack(m_fDstRot); + break; + } + + case FUNC_COMBO: + { + if (IsWalking()) + EndWalking(); + + __DisableSkipCollision(); + m_isGoing = FALSE; + + BlockMovement(); + SCRIPT_SetPixelPosition(NEW_GetDstPixelPositionRef().x, NEW_GetDstPixelPositionRef().y); + RunComboAttack(m_fDstRot, m_kMovAfterFunc.uArg); + break; + } + + case FUNC_EMOTION: + { + m_isGoing = FALSE; + m_kMovAfterFunc.eFunc = FUNC_WAIT; + __DisableSkipCollision(); + BlockMovement(); + + DWORD dwMotionNumber = m_kMovAfterFunc.uArg; + DWORD dwTargetVID = m_kMovAfterFunc.uArgExpanded; + __ProcessFunctionEmotion(dwMotionNumber, dwTargetVID, m_kMovAfterFunc.kPosDst); + break; + } + + case FUNC_MOVE: + { + break; + } + + case FUNC_MOB_SKILL: + { + if (IsWalking()) + EndWalking(); + + __DisableSkipCollision(); + m_isGoing = FALSE; + + BlockMovement(); + SCRIPT_SetPixelPosition(NEW_GetDstPixelPositionRef().x, NEW_GetDstPixelPositionRef().y); + SetAdvancingRotation(m_fDstRot); + SetRotation(m_fDstRot); + + m_GraphicThingInstance.InterceptOnceMotion(CRaceMotionData::NAME_SPECIAL_1 + m_kMovAfterFunc.uArg); + break; + } + + default: + { + if (m_kMovAfterFunc.eFunc & FUNC_SKILL) + { + SetAdvancingRotation(m_fDstRot); + BlendRotation(m_fDstRot); + NEW_UseSkill(0, m_kMovAfterFunc.eFunc & 0x7f, m_kMovAfterFunc.uArg&0x0f, (m_kMovAfterFunc.uArg>>4) ? true : false); + } + else + { + //Tracenf("VID %d 스킬 공격 (%f, %f) rot %f", GetVirtualID(), NEW_GetDstPixelPositionRef().x, NEW_GetDstPixelPositionRef().y, m_fDstRot); + + __DisableSkipCollision(); + m_isGoing = FALSE; + + BlockMovement(); + SCRIPT_SetPixelPosition(NEW_GetDstPixelPositionRef().x, NEW_GetDstPixelPositionRef().y); + SetAdvancingRotation(m_fDstRot); + BlendRotation(m_fDstRot); + if (!IsWaiting()) + { + EndWalking(); + } + + //Tracenf("VID %d 정지 (%f, %f) rot %f IsWalking %d", GetVirtualID(), NEW_GetDstPixelPositionRef().x, NEW_GetDstPixelPositionRef().y, m_fDstRot, IsWalking()); + } + break; + } + } + + } + } + + } + } + + if (IsWalking() || m_GraphicThingInstance.IsUsingMovingSkill()) + { + float fRotation = m_GraphicThingInstance.GetRotation(); + float fAdvancingRotation = m_GraphicThingInstance.GetAdvancingRotation(); + int iDirection = GetRotatingDirection(fRotation, fAdvancingRotation); + + if (DEGREE_DIRECTION_SAME != m_iRotatingDirection) + { + if (DEGREE_DIRECTION_LEFT == iDirection) + { + fRotation = fmodf(fRotation + m_fRotSpd*m_GraphicThingInstance.GetSecondElapsed(), 360.0f); + } + else if (DEGREE_DIRECTION_RIGHT == iDirection) + { + fRotation = fmodf(fRotation - m_fRotSpd*m_GraphicThingInstance.GetSecondElapsed() + 360.0f, 360.0f); + } + + if (m_iRotatingDirection != GetRotatingDirection(fRotation, fAdvancingRotation)) + { + m_iRotatingDirection = DEGREE_DIRECTION_SAME; + fRotation = fAdvancingRotation; + } + + m_GraphicThingInstance.SetRotation(fRotation); + } + + if (__IsInDustRange()) + { + float fDustDistance = NEW_GetDistanceFromDestPixelPosition(m_kPPosDust); + if (IsMountingHorse()) + { + if (fDustDistance > ms_fHorseDustGap) + { + NEW_GetPixelPosition(&m_kPPosDust); + __AttachEffect(EFFECT_HORSE_DUST); + } + } + else + { + if (fDustDistance > ms_fDustGap) + { + NEW_GetPixelPosition(&m_kPPosDust); + __AttachEffect(EFFECT_DUST); + } + } + } + } +} + +void CInstanceBase::__ProcessFunctionEmotion(DWORD dwMotionNumber, DWORD dwTargetVID, const TPixelPosition & c_rkPosDst) +{ + if (IsWalking()) + EndWalkingWithoutBlending(); + + __EnableChangingTCPState(); + SCRIPT_SetPixelPosition(c_rkPosDst.x, c_rkPosDst.y); + + CInstanceBase * pTargetInstance = CPythonCharacterManager::Instance().GetInstancePtr(dwTargetVID); + if (pTargetInstance) + { + pTargetInstance->__EnableChangingTCPState(); + + if (pTargetInstance->IsWalking()) + pTargetInstance->EndWalkingWithoutBlending(); + + WORD wMotionNumber1 = HIWORD(dwMotionNumber); + WORD wMotionNumber2 = LOWORD(dwMotionNumber); + + int src_job = RaceToJob(GetRace()); + int dst_job = RaceToJob(pTargetInstance->GetRace()); + + NEW_LookAtDestInstance(*pTargetInstance); + m_GraphicThingInstance.InterceptOnceMotion(wMotionNumber1 + dst_job); + m_GraphicThingInstance.SetRotation(m_GraphicThingInstance.GetTargetRotation()); + m_GraphicThingInstance.SetAdvancingRotation(m_GraphicThingInstance.GetTargetRotation()); + + pTargetInstance->NEW_LookAtDestInstance(*this); + pTargetInstance->m_GraphicThingInstance.InterceptOnceMotion(wMotionNumber2 + src_job); + pTargetInstance->m_GraphicThingInstance.SetRotation(pTargetInstance->m_GraphicThingInstance.GetTargetRotation()); + pTargetInstance->m_GraphicThingInstance.SetAdvancingRotation(pTargetInstance->m_GraphicThingInstance.GetTargetRotation()); + + if (pTargetInstance->__IsMainInstance()) + { + IAbstractPlayer & rPlayer=IAbstractPlayer::GetSingleton(); + rPlayer.EndEmotionProcess(); + } + } + + if (__IsMainInstance()) + { + IAbstractPlayer & rPlayer=IAbstractPlayer::GetSingleton(); + rPlayer.EndEmotionProcess(); + } +} + +/////////////////////////////////////////////////////////////////////////////////////////////////// +// Update & Deform & Render + +int g_iAccumulationTime = 0; + +void CInstanceBase::Update() +{ + ++ms_dwUpdateCounter; + + StateProcess(); + m_GraphicThingInstance.PhysicsProcess(); + m_GraphicThingInstance.RotationProcess(); + m_GraphicThingInstance.ComboProcess(); + m_GraphicThingInstance.AccumulationMovement(); + + if (m_GraphicThingInstance.IsMovement()) + { + TPixelPosition kPPosCur; + NEW_GetPixelPosition(&kPPosCur); + + DWORD dwCurTime=ELTimer_GetFrameMSec(); + //if (m_dwNextUpdateHeightTimeHORSE_MotionProcess(FALSE); + } + + __ComboProcess(); + + ProcessDamage(); + +} + +void CInstanceBase::Transform() +{ + if (__IsSyncing()) + { + //OnSyncing(); + } + else + { + if (IsWalking() || m_GraphicThingInstance.IsUsingMovingSkill()) + { + const D3DXVECTOR3& c_rv3Movment=m_GraphicThingInstance.GetMovementVectorRef(); + + float len=(c_rv3Movment.x*c_rv3Movment.x)+(c_rv3Movment.y*c_rv3Movment.y); + if (len>1.0f) + OnMoving(); + else + OnWaiting(); + } + } + + m_GraphicThingInstance.INSTANCEBASE_Transform(); +} + + +void CInstanceBase::Deform() +{ + // 2004.07.17.levites.isShow를 ViewFrustumCheck로 변경 + if (!__CanRender()) + return; + + ++ms_dwDeformCounter; + + m_GraphicThingInstance.INSTANCEBASE_Deform(); + + m_kHorse.Deform(); +} + +void CInstanceBase::RenderTrace() +{ + if (!__CanRender()) + return; + + m_GraphicThingInstance.RenderTrace(); +} + + + + +void CInstanceBase::Render() +{ + // 2004.07.17.levites.isShow를 ViewFrustumCheck로 변경 + if (!__CanRender()) + return; + + ++ms_dwRenderCounter; + + m_kHorse.Render(); + m_GraphicThingInstance.Render(); + + if (CActorInstance::IsDirLine()) + { + if (NEW_GetDstPixelPositionRef().x != 0.0f) + { + static CScreen s_kScreen; + + STATEMANAGER.SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_DIFFUSE); + STATEMANAGER.SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_SELECTARG1); + STATEMANAGER.SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_DISABLE); + STATEMANAGER.SaveRenderState(D3DRS_ZENABLE, FALSE); + STATEMANAGER.SetRenderState(D3DRS_FOGENABLE, FALSE); + STATEMANAGER.SetRenderState(D3DRS_LIGHTING, FALSE); + + TPixelPosition px; + m_GraphicThingInstance.GetPixelPosition(&px); + D3DXVECTOR3 kD3DVt3Cur(px.x, px.y, px.z); + //D3DXVECTOR3 kD3DVt3Cur(NEW_GetSrcPixelPositionRef().x, -NEW_GetSrcPixelPositionRef().y, NEW_GetSrcPixelPositionRef().z); + D3DXVECTOR3 kD3DVt3Dest(NEW_GetDstPixelPositionRef().x, -NEW_GetDstPixelPositionRef().y, NEW_GetDstPixelPositionRef().z); + + //printf("%s %f\n", GetNameString(), kD3DVt3Cur.y - kD3DVt3Dest.y); + //float fdx = NEW_GetDstPixelPositionRef().x - NEW_GetSrcPixelPositionRef().x; + //float fdy = NEW_GetDstPixelPositionRef().y - NEW_GetSrcPixelPositionRef().y; + + s_kScreen.SetDiffuseColor(0.0f, 0.0f, 1.0f); + s_kScreen.RenderLine3d(kD3DVt3Cur.x, kD3DVt3Cur.y, px.z, kD3DVt3Dest.x, kD3DVt3Dest.y, px.z); + STATEMANAGER.RestoreRenderState(D3DRS_ZENABLE); + STATEMANAGER.SetRenderState(D3DRS_FOGENABLE, TRUE); + STATEMANAGER.SetRenderState(D3DRS_LIGHTING, TRUE); + } + } +} + +void CInstanceBase::RenderToShadowMap() +{ + if (IsDoor()) + return; + + if (IsBuilding()) + return; + + if (!__CanRender()) + return; + + if (!__IsExistMainInstance()) + return; + + CInstanceBase* pkInstMain=__GetMainInstancePtr(); + + const float SHADOW_APPLY_DISTANCE = 2500.0f; + + float fDistance=NEW_GetDistanceFromDestInstance(*pkInstMain); + if (fDistance>=SHADOW_APPLY_DISTANCE) + return; + + m_GraphicThingInstance.RenderToShadowMap(); +} + +void CInstanceBase::RenderCollision() +{ + m_GraphicThingInstance.RenderCollisionData(); +} + +/////////////////////////////////////////////////////////////////////////////////////////////////// +// Setting & Getting Data + +void CInstanceBase::SetVirtualID(DWORD dwVirtualID) +{ + m_GraphicThingInstance.SetVirtualID(dwVirtualID); +} + +void CInstanceBase::SetVirtualNumber(DWORD dwVirtualNumber) +{ + m_dwVirtualNumber = dwVirtualNumber; +} + +void CInstanceBase::SetInstanceType(int iInstanceType) +{ + m_GraphicThingInstance.SetActorType(iInstanceType); +} + +void CInstanceBase::SetAlignment(short sAlignment) +{ + m_sAlignment = sAlignment; + RefreshTextTailTitle(); +} + +void CInstanceBase::SetPKMode(BYTE byPKMode) +{ + if (m_byPKMode == byPKMode) + return; + + m_byPKMode = byPKMode; + + if (__IsMainInstance()) + { + IAbstractPlayer& rPlayer=IAbstractPlayer::GetSingleton(); + rPlayer.NotifyChangePKMode(); + } +} + +void CInstanceBase::SetKiller(bool bFlag) +{ + if (m_isKiller == bFlag) + return; + + m_isKiller = bFlag; + RefreshTextTail(); +} + +void CInstanceBase::SetPartyMemberFlag(bool bFlag) +{ + m_isPartyMember = bFlag; +} + +void CInstanceBase::SetStateFlags(DWORD dwStateFlags) +{ + if (dwStateFlags & ADD_CHARACTER_STATE_KILLER) + SetKiller(TRUE); + else + SetKiller(FALSE); + + if (dwStateFlags & ADD_CHARACTER_STATE_PARTY) + SetPartyMemberFlag(TRUE); + else + SetPartyMemberFlag(FALSE); +} + +void CInstanceBase::SetComboType(UINT uComboType) +{ + m_GraphicThingInstance.SetComboType(uComboType); +} + +const char * CInstanceBase::GetNameString() +{ + return m_stName.c_str(); +} + +DWORD CInstanceBase::GetRace() +{ + return m_dwRace; +} + + +bool CInstanceBase::IsConflictAlignmentInstance(CInstanceBase& rkInstVictim) +{ + if (PK_MODE_PROTECT == rkInstVictim.GetPKMode()) + return false; + + switch (GetAlignmentType()) + { + case ALIGNMENT_TYPE_NORMAL: + case ALIGNMENT_TYPE_WHITE: + if (ALIGNMENT_TYPE_DARK == rkInstVictim.GetAlignmentType()) + return true; + break; + case ALIGNMENT_TYPE_DARK: + if (GetAlignmentType() != rkInstVictim.GetAlignmentType()) + return true; + break; + } + + return false; +} + +void CInstanceBase::SetDuelMode(DWORD type) +{ + m_dwDuelMode = type; +} + +DWORD CInstanceBase::GetDuelMode() +{ + return m_dwDuelMode; +} + +bool CInstanceBase::IsAttackableInstance(CInstanceBase& rkInstVictim) +{ + if (__IsMainInstance()) + { + CPythonPlayer& rkPlayer=CPythonPlayer::Instance(); + if(rkPlayer.IsObserverMode()) + return false; + } + + if (GetVirtualID() == rkInstVictim.GetVirtualID()) + return false; + + if (IsStone()) + { + if (rkInstVictim.IsPC()) + return true; + } + else if (IsPC()) + { + if (rkInstVictim.IsStone()) + return true; + + if (rkInstVictim.IsPC()) + { + if (GetDuelMode()) + { + switch(GetDuelMode()) + { + case DUEL_CANNOTATTACK: + return false; + case DUEL_START: + if(__FindDUELKey(GetVirtualID(),rkInstVictim.GetVirtualID())) + return true; + else + return false; + } + } + if (PK_MODE_GUILD == GetPKMode()) + if (GetGuildID() == rkInstVictim.GetGuildID()) + return false; + + if (rkInstVictim.IsKiller()) + if (!IAbstractPlayer::GetSingleton().IsSamePartyMember(GetVirtualID(), rkInstVictim.GetVirtualID())) + return true; + + if (PK_MODE_PROTECT != GetPKMode()) + { + if (PK_MODE_FREE == GetPKMode()) + { + if (PK_MODE_PROTECT != rkInstVictim.GetPKMode()) + if (!IAbstractPlayer::GetSingleton().IsSamePartyMember(GetVirtualID(), rkInstVictim.GetVirtualID())) + return true; + } + if (PK_MODE_GUILD == GetPKMode()) + { + if (PK_MODE_PROTECT != rkInstVictim.GetPKMode()) + if (!IAbstractPlayer::GetSingleton().IsSamePartyMember(GetVirtualID(), rkInstVictim.GetVirtualID())) + if (GetGuildID() != rkInstVictim.GetGuildID()) + return true; + } + } + + if (IsSameEmpire(rkInstVictim)) + { + if (IsPVPInstance(rkInstVictim)) + return true; + + if (PK_MODE_REVENGE == GetPKMode()) + if (!IAbstractPlayer::GetSingleton().IsSamePartyMember(GetVirtualID(), rkInstVictim.GetVirtualID())) + if (IsConflictAlignmentInstance(rkInstVictim)) + return true; + } + else + { + return true; + } + } + + if (rkInstVictim.IsEnemy()) + return true; + + if (rkInstVictim.IsWoodenDoor()) + return true; + } + else if (IsEnemy()) + { + if (rkInstVictim.IsPC()) + return true; + + if (rkInstVictim.IsBuilding()) + return true; + + } + else if (IsPoly()) + { + if (rkInstVictim.IsPC()) + return true; + + if (rkInstVictim.IsEnemy()) + return true; + } + return false; +} + +bool CInstanceBase::IsTargetableInstance(CInstanceBase& rkInstVictim) +{ + return rkInstVictim.CanPickInstance(); +} + +// 2004. 07. 07. [levites] - 스킬 사용중 타겟이 바뀌는 문제 해결을 위한 코드 +bool CInstanceBase::CanChangeTarget() +{ + return m_GraphicThingInstance.CanChangeTarget(); +} + +// 2004.07.17.levites.isShow를 ViewFrustumCheck로 변경 +bool CInstanceBase::CanPickInstance() +{ + if (!__IsInViewFrustum()) + return false; + + if (IsDoor()) + { + if (IsDead()) + return false; + } + + if (IsPC()) + { + if (IsAffect(AFFECT_EUNHYEONG)) + { + if (!__MainCanSeeHiddenThing()) + return false; + } + if (IsAffect(AFFECT_REVIVE_INVISIBILITY)) + return false; + if (IsAffect(AFFECT_INVISIBILITY)) + return false; + } + + if (IsDead()) + return false; + + return true; +} + +bool CInstanceBase::CanViewTargetHP(CInstanceBase& rkInstVictim) +{ + if (rkInstVictim.IsStone()) + return true; + if (rkInstVictim.IsWoodenDoor()) + return true; + if (rkInstVictim.IsEnemy()) + return true; + + return false; +} + +BOOL CInstanceBase::IsPoly() +{ + return m_GraphicThingInstance.IsPoly(); +} + +BOOL CInstanceBase::IsPC() +{ + return m_GraphicThingInstance.IsPC(); +} + +BOOL CInstanceBase::IsNPC() +{ + return m_GraphicThingInstance.IsNPC(); +} + +BOOL CInstanceBase::IsEnemy() +{ + return m_GraphicThingInstance.IsEnemy(); +} + +BOOL CInstanceBase::IsStone() +{ + return m_GraphicThingInstance.IsStone(); +} + + +BOOL CInstanceBase::IsGuildWall() //IsBuilding 길드건물전체 IsGuildWall은 담장벽만(문은 제외) +{ + return IsWall(m_dwRace); +} + + +BOOL CInstanceBase::IsResource() +{ + switch (m_dwVirtualNumber) + { + case 20047: + case 20048: + case 20049: + case 20050: + case 20051: + case 20052: + case 20053: + case 20054: + case 20055: + case 20056: + case 20057: + case 20058: + case 20059: + case 30301: + case 30302: + case 30303: + case 30304: + case 30305: + return TRUE; + } + + return FALSE; +} + +BOOL CInstanceBase::IsWarp() +{ + return m_GraphicThingInstance.IsWarp(); +} + +BOOL CInstanceBase::IsGoto() +{ + return m_GraphicThingInstance.IsGoto(); +} + +BOOL CInstanceBase::IsObject() +{ + return m_GraphicThingInstance.IsObject(); +} + +BOOL CInstanceBase::IsBuilding() +{ + return m_GraphicThingInstance.IsBuilding(); +} + +BOOL CInstanceBase::IsDoor() +{ + return m_GraphicThingInstance.IsDoor(); +} + +BOOL CInstanceBase::IsWoodenDoor() +{ + if (m_GraphicThingInstance.IsDoor()) + { + int vnum = GetVirtualNumber(); + if (vnum == 13000) // 나무문 + return true; + else if (vnum >= 30111 && vnum <= 30119) // 사귀문 + return true; + else + return false; + } + else + { + return false; + } +} + +BOOL CInstanceBase::IsStoneDoor() +{ + return m_GraphicThingInstance.IsDoor() && 13001 == GetVirtualNumber(); +} + +BOOL CInstanceBase::IsFlag() +{ + if (GetRace() == 20035) + return TRUE; + if (GetRace() == 20036) + return TRUE; + if (GetRace() == 20037) + return TRUE; + + return FALSE; +} + +BOOL CInstanceBase::IsForceVisible() +{ + if (IsAffect(AFFECT_SHOW_ALWAYS)) + return TRUE; + + if (IsObject() || IsBuilding() || IsDoor() ) + return TRUE; + + return FALSE; +} + +int CInstanceBase::GetInstanceType() +{ + return m_GraphicThingInstance.GetActorType(); +} + +DWORD CInstanceBase::GetVirtualID() +{ + return m_GraphicThingInstance.GetVirtualID(); +} + +DWORD CInstanceBase::GetVirtualNumber() +{ + return m_dwVirtualNumber; +} + +// 2004.07.17.levites.isShow를 ViewFrustumCheck로 변경 +bool CInstanceBase::__IsInViewFrustum() +{ + return m_GraphicThingInstance.isShow(); +} + +bool CInstanceBase::__CanRender() +{ + if (!__IsInViewFrustum()) + return false; + if (IsAffect(AFFECT_INVISIBILITY)) + return false; + + return true; +} + + +/////////////////////////////////////////////////////////////////////////////////////////////////// +// Graphic Control + +bool CInstanceBase::IntersectBoundingBox() +{ + float u, v, t; + return m_GraphicThingInstance.Intersect(&u, &v, &t); +} + +bool CInstanceBase::IntersectDefendingSphere() +{ + return m_GraphicThingInstance.IntersectDefendingSphere(); +} + +float CInstanceBase::GetDistance(CInstanceBase * pkTargetInst) +{ + TPixelPosition TargetPixelPosition; + pkTargetInst->m_GraphicThingInstance.GetPixelPosition(&TargetPixelPosition); + return GetDistance(TargetPixelPosition); +} + +float CInstanceBase::GetDistance(const TPixelPosition & c_rPixelPosition) +{ + TPixelPosition PixelPosition; + m_GraphicThingInstance.GetPixelPosition(&PixelPosition); + + float fdx = PixelPosition.x - c_rPixelPosition.x; + float fdy = PixelPosition.y - c_rPixelPosition.y; + + return sqrtf((fdx*fdx) + (fdy*fdy)); +} + +CActorInstance& CInstanceBase::GetGraphicThingInstanceRef() +{ + return m_GraphicThingInstance; +} + +CActorInstance* CInstanceBase::GetGraphicThingInstancePtr() +{ + return &m_GraphicThingInstance; +} + +void CInstanceBase::RefreshActorInstance() +{ + m_GraphicThingInstance.RefreshActorInstance(); +} + +void CInstanceBase::Refresh(DWORD dwMotIndex, bool isLoop) +{ + RefreshState(dwMotIndex, isLoop); +} + +void CInstanceBase::RestoreRenderMode() +{ + m_GraphicThingInstance.RestoreRenderMode(); +} + +void CInstanceBase::SetAddRenderMode() +{ + m_GraphicThingInstance.SetAddRenderMode(); +} + +void CInstanceBase::SetModulateRenderMode() +{ + m_GraphicThingInstance.SetModulateRenderMode(); +} + +void CInstanceBase::SetRenderMode(int iRenderMode) +{ + m_GraphicThingInstance.SetRenderMode(iRenderMode); +} + +void CInstanceBase::SetAddColor(const D3DXCOLOR & c_rColor) +{ + m_GraphicThingInstance.SetAddColor(c_rColor); +} + +void CInstanceBase::__SetBlendRenderingMode() +{ + m_GraphicThingInstance.SetBlendRenderMode(); +} + +void CInstanceBase::__SetAlphaValue(float fAlpha) +{ + m_GraphicThingInstance.SetAlphaValue(fAlpha); +} + +float CInstanceBase::__GetAlphaValue() +{ + return m_GraphicThingInstance.GetAlphaValue(); +} + +/////////////////////////////////////////////////////////////////////////////////////////////////// +// Part + +void CInstanceBase::SetHair(DWORD eHair) +{ + if (!HAIR_COLOR_ENABLE) + return; + + if (IsPC()==false) + return; + m_awPart[CRaceData::PART_HAIR] = eHair; + m_GraphicThingInstance.SetHair(eHair); +} + +void CInstanceBase::ChangeHair(DWORD eHair) +{ + if (!HAIR_COLOR_ENABLE) + return; + + if (IsPC()==false) + return; + + if (GetPart(CRaceData::PART_HAIR)==eHair) + return; + + SetHair(eHair); + + //int type = m_GraphicThingInstance.GetMotionMode(); + + RefreshState(CRaceMotionData::NAME_WAIT, true); + //RefreshState(type, true); +} + +void CInstanceBase::SetArmor(DWORD dwArmor) +{ + DWORD dwShape; + if (__ArmorVnumToShape(dwArmor, &dwShape)) + { + CItemData * pItemData; + if (CItemManager::Instance().GetItemDataPointer(dwArmor, &pItemData)) + { + float fSpecularPower=pItemData->GetSpecularPowerf(); + SetShape(dwShape, fSpecularPower); + __GetRefinedEffect(pItemData); + return; + } + else + __ClearArmorRefineEffect(); + } + + SetShape(dwArmor); +} + +void CInstanceBase::SetShape(DWORD eShape, float fSpecular) +{ + if (IsPoly()) + { + m_GraphicThingInstance.SetShape(0); + } + else + { + m_GraphicThingInstance.SetShape(eShape, fSpecular); + } + + m_eShape = eShape; +} + + + +DWORD CInstanceBase::GetWeaponType() +{ + DWORD dwWeapon = GetPart(CRaceData::PART_WEAPON); + CItemData * pItemData; + if (!CItemManager::Instance().GetItemDataPointer(dwWeapon, &pItemData)) + return CItemData::WEAPON_NONE; + + return pItemData->GetWeaponType(); +} + +/* +void CInstanceBase::SetParts(const WORD * c_pParts) +{ + if (IsPoly()) + return; + + if (__IsShapeAnimalWear()) + return; + + UINT eWeapon=c_pParts[CRaceData::PART_WEAPON]; + + if (__IsChangableWeapon(eWeapon) == false) + eWeapon = 0; + + if (eWeapon != m_GraphicThingInstance.GetPartItemID(CRaceData::PART_WEAPON)) + { + m_GraphicThingInstance.AttachPart(CRaceData::PART_MAIN, CRaceData::PART_WEAPON, eWeapon); + m_awPart[CRaceData::PART_WEAPON] = eWeapon; + } + + __AttachHorseSaddle(); +} +*/ + +void CInstanceBase::__ClearWeaponRefineEffect() +{ + if (m_swordRefineEffectRight) + { + __DetachEffect(m_swordRefineEffectRight); + m_swordRefineEffectRight = 0; + } + if (m_swordRefineEffectLeft) + { + __DetachEffect(m_swordRefineEffectLeft); + m_swordRefineEffectLeft = 0; + } +} + +void CInstanceBase::__ClearArmorRefineEffect() +{ + if (m_armorRefineEffect) + { + __DetachEffect(m_armorRefineEffect); + m_armorRefineEffect = 0; + } +} + +UINT CInstanceBase::__GetRefinedEffect(CItemData* pItem) +{ + DWORD refine = max(pItem->GetRefine() + pItem->GetSocketCount(),CItemData::ITEM_SOCKET_MAX_NUM) - CItemData::ITEM_SOCKET_MAX_NUM; + switch (pItem->GetType()) + { + case CItemData::ITEM_TYPE_WEAPON: + __ClearWeaponRefineEffect(); + if (refine < 7) //현재 제련도 7 이상만 이펙트가 있습니다. + return 0; + switch(pItem->GetSubType()) + { + case CItemData::WEAPON_DAGGER: + m_swordRefineEffectRight = EFFECT_REFINED+EFFECT_SMALLSWORD_REFINED7+refine-7; + m_swordRefineEffectLeft = EFFECT_REFINED+EFFECT_SMALLSWORD_REFINED7_LEFT+refine-7; + break; + case CItemData::WEAPON_FAN: + m_swordRefineEffectRight = EFFECT_REFINED+EFFECT_FANBELL_REFINED7+refine-7; + break; + case CItemData::WEAPON_ARROW: + case CItemData::WEAPON_BELL: + m_swordRefineEffectRight = EFFECT_REFINED+EFFECT_SMALLSWORD_REFINED7+refine-7; + break; + case CItemData::WEAPON_BOW: + m_swordRefineEffectRight = EFFECT_REFINED+EFFECT_BOW_REFINED7+refine-7; + break; + default: + m_swordRefineEffectRight = EFFECT_REFINED+EFFECT_SWORD_REFINED7+refine-7; + } + if (m_swordRefineEffectRight) + m_swordRefineEffectRight = __AttachEffect(m_swordRefineEffectRight); + if (m_swordRefineEffectLeft) + m_swordRefineEffectLeft = __AttachEffect(m_swordRefineEffectLeft); + break; + case CItemData::ITEM_TYPE_ARMOR: + __ClearArmorRefineEffect(); + + // 갑옷 특화 이펙트 + if (pItem->GetSubType() == CItemData::ARMOR_BODY) + { + DWORD vnum = pItem->GetIndex(); + + if (12010 <= vnum && vnum <= 12049) + { + __AttachEffect(EFFECT_REFINED+EFFECT_BODYARMOR_SPECIAL); + __AttachEffect(EFFECT_REFINED+EFFECT_BODYARMOR_SPECIAL2); + } + } + + if (refine < 7) //현재 제련도 7 이상만 이펙트가 있습니다. + return 0; + + if (pItem->GetSubType() == CItemData::ARMOR_BODY) + { + m_armorRefineEffect = EFFECT_REFINED+EFFECT_BODYARMOR_REFINED7+refine-7; + __AttachEffect(m_armorRefineEffect); + } + break; + } + return 0; +} + +bool CInstanceBase::SetWeapon(DWORD eWeapon) +{ + if (IsPoly()) + return false; + + if (__IsShapeAnimalWear()) + return false; + + if (__IsChangableWeapon(eWeapon) == false) + eWeapon = 0; + + m_GraphicThingInstance.AttachWeapon(eWeapon); + m_awPart[CRaceData::PART_WEAPON] = eWeapon; + + //Weapon Effect + CItemData * pItemData; + if (CItemManager::Instance().GetItemDataPointer(eWeapon, &pItemData)) + __GetRefinedEffect(pItemData); + else + __ClearWeaponRefineEffect(); + + return true; +} + +void CInstanceBase::ChangeWeapon(DWORD eWeapon) +{ + if (eWeapon == m_GraphicThingInstance.GetPartItemID(CRaceData::PART_WEAPON)) + return; + + if (SetWeapon(eWeapon)) + RefreshState(CRaceMotionData::NAME_WAIT, true); +} + +bool CInstanceBase::ChangeArmor(DWORD dwArmor) +{ + DWORD eShape; + __ArmorVnumToShape(dwArmor, &eShape); + + if (GetShape()==eShape) + return false; + + CAffectFlagContainer kAffectFlagContainer; + kAffectFlagContainer.CopyInstance(m_kAffectFlagContainer); + + DWORD dwVID = GetVirtualID(); + DWORD dwRace = GetRace(); + DWORD eHair = GetPart(CRaceData::PART_HAIR); + DWORD eWeapon = GetPart(CRaceData::PART_WEAPON); + float fRot = GetRotation(); + float fAdvRot = GetAdvancingRotation(); + + if (IsWalking()) + EndWalking(); + + // 2004.07.25.myevan.이펙트 안 붙는 문제 + ////////////////////////////////////////////////////// + __ClearAffects(); + ////////////////////////////////////////////////////// + + if (!SetRace(dwRace)) + { + TraceError("CPythonCharacterManager::ChangeArmor - SetRace VID[%d] Race[%d] ERROR", dwVID, dwRace); + return false; + } + + SetArmor(dwArmor); + SetHair(eHair); + SetWeapon(eWeapon); + + SetRotation(fRot); + SetAdvancingRotation(fAdvRot); + + __AttachHorseSaddle(); + + RefreshState(CRaceMotionData::NAME_WAIT, TRUE); + + // 2004.07.25.myevan.이펙트 안 붙는 문제 + ///////////////////////////////////////////////// + SetAffectFlagContainer(kAffectFlagContainer); + ///////////////////////////////////////////////// + + CActorInstance::IEventHandler& rkEventHandler=GetEventHandlerRef(); + rkEventHandler.OnChangeShape(); + + return true; +} + +bool CInstanceBase::__IsShapeAnimalWear() +{ + if (100 == GetShape() || + 101 == GetShape() || + 102 == GetShape() || + 103 == GetShape()) + return true; + + return false; +} + +DWORD CInstanceBase::__GetRaceType() +{ + return m_eRaceType; +} + + +void CInstanceBase::RefreshState(DWORD dwMotIndex, bool isLoop) +{ + DWORD dwPartItemID = m_GraphicThingInstance.GetPartItemID(CRaceData::PART_WEAPON); + + BYTE byItemType = 0xff; + BYTE bySubType = 0xff; + + CItemManager & rkItemMgr = CItemManager::Instance(); + CItemData * pItemData; + + if (rkItemMgr.GetItemDataPointer(dwPartItemID, &pItemData)) + { + byItemType = pItemData->GetType(); + bySubType = pItemData->GetWeaponType(); + } + + if (IsPoly()) + { + SetMotionMode(CRaceMotionData::MODE_GENERAL); + } + else if (IsWearingDress()) + { + SetMotionMode(CRaceMotionData::MODE_WEDDING_DRESS); + } + else if (IsHoldingPickAxe()) + { + if (m_kHorse.IsMounting()) + { + SetMotionMode(CRaceMotionData::MODE_HORSE); + } + else + { + SetMotionMode(CRaceMotionData::MODE_GENERAL); + } + } + else if (CItemData::ITEM_TYPE_ROD == byItemType) + { + if (m_kHorse.IsMounting()) + { + SetMotionMode(CRaceMotionData::MODE_HORSE); + } + else + { + SetMotionMode(CRaceMotionData::MODE_FISHING); + } + } + else if (m_kHorse.IsMounting()) + { + switch (bySubType) + { + case CItemData::WEAPON_SWORD: + SetMotionMode(CRaceMotionData::MODE_HORSE_ONEHAND_SWORD); + break; + + case CItemData::WEAPON_TWO_HANDED: + SetMotionMode(CRaceMotionData::MODE_HORSE_TWOHAND_SWORD); // Only Warrior + break; + + case CItemData::WEAPON_DAGGER: + SetMotionMode(CRaceMotionData::MODE_HORSE_DUALHAND_SWORD); // Only Assassin + break; + + case CItemData::WEAPON_FAN: + SetMotionMode(CRaceMotionData::MODE_HORSE_FAN); // Only Shaman + break; + + case CItemData::WEAPON_BELL: + SetMotionMode(CRaceMotionData::MODE_HORSE_BELL); // Only Shaman + break; + + case CItemData::WEAPON_BOW: + SetMotionMode(CRaceMotionData::MODE_HORSE_BOW); // Only Shaman + break; + + default: + SetMotionMode(CRaceMotionData::MODE_HORSE); + break; + } + } + else + { + switch (bySubType) + { + case CItemData::WEAPON_SWORD: + SetMotionMode(CRaceMotionData::MODE_ONEHAND_SWORD); + break; + + case CItemData::WEAPON_TWO_HANDED: + SetMotionMode(CRaceMotionData::MODE_TWOHAND_SWORD); // Only Warrior + break; + + case CItemData::WEAPON_DAGGER: + SetMotionMode(CRaceMotionData::MODE_DUALHAND_SWORD); // Only Assassin + break; + + case CItemData::WEAPON_BOW: + SetMotionMode(CRaceMotionData::MODE_BOW); // Only Assassin + break; + + case CItemData::WEAPON_FAN: + SetMotionMode(CRaceMotionData::MODE_FAN); // Only Shaman + break; + + case CItemData::WEAPON_BELL: + SetMotionMode(CRaceMotionData::MODE_BELL); // Only Shaman + break; + + case CItemData::WEAPON_ARROW: + default: + SetMotionMode(CRaceMotionData::MODE_GENERAL); + break; + } + } + + if (isLoop) + m_GraphicThingInstance.InterceptLoopMotion(dwMotIndex); + else + m_GraphicThingInstance.InterceptOnceMotion(dwMotIndex); + + RefreshActorInstance(); +} + +/////////////////////////////////////////////////////////////////////////////////////////////////// +// Device + +void CInstanceBase::RegisterBoundingSphere() +{ + // Stone 일 경우 DeforomNoSkin 을 하면 + // 낙하하는 애니메이션 같은 경우 애니메이션이 + // 바운드 박스에 영향을 미쳐 컬링이 제대로 이루어지지 않는다. + if (!IsStone()) + { + m_GraphicThingInstance.DeformNoSkin(); + } + + m_GraphicThingInstance.RegisterBoundingSphere(); +} + +bool CInstanceBase::CreateDeviceObjects() +{ + return m_GraphicThingInstance.CreateDeviceObjects(); +} + +void CInstanceBase::DestroyDeviceObjects() +{ + m_GraphicThingInstance.DestroyDeviceObjects(); +} + +void CInstanceBase::Destroy() +{ + DetachTextTail(); + + DismountHorse(); + + m_kQue_kCmdNew.clear(); + + __EffectContainer_Destroy(); + __StoneSmoke_Destroy(); + + if (__IsMainInstance()) + __ClearMainInstance(); + + m_GraphicThingInstance.Destroy(); + + __Initialize(); +} + +void CInstanceBase::__InitializeRotationSpeed() +{ + SetRotationSpeed(c_fDefaultRotationSpeed); +} + +void CInstanceBase::__Warrior_Initialize() +{ + m_kWarrior.m_dwGeomgyeongEffect=0; +} + +void CInstanceBase::__Initialize() +{ + __Warrior_Initialize(); + __StoneSmoke_Inialize(); + __EffectContainer_Initialize(); + __InitializeRotationSpeed(); + + SetEventHandler(CActorInstance::IEventHandler::GetEmptyPtr()); + + m_kAffectFlagContainer.Clear(); + + m_dwLevel = 0; + m_dwGuildID = 0; + m_dwEmpireID = 0; + + m_eType = 0; + m_eRaceType = 0; + m_eShape = 0; + m_dwRace = 0; + m_dwVirtualNumber = 0; + + m_dwBaseCmdTime=0; + m_dwBaseChkTime=0; + m_dwSkipTime=0; + + m_GraphicThingInstance.Initialize(); + + m_dwAdvActorVID=0; + m_dwLastDmgActorVID=0; + + m_nAverageNetworkGap=0; + m_dwNextUpdateHeightTime=0; + + // Moving by keyboard + m_iRotatingDirection = DEGREE_DIRECTION_SAME; + + // Moving by mouse + m_isTextTail = FALSE; + m_isGoing = FALSE; + NEW_SetSrcPixelPosition(TPixelPosition(0, 0, 0)); + NEW_SetDstPixelPosition(TPixelPosition(0, 0, 0)); + + m_kPPosDust = TPixelPosition(0, 0, 0); + + + m_kQue_kCmdNew.clear(); + + m_dwLastComboIndex = 0; + + m_swordRefineEffectRight = 0; + m_swordRefineEffectLeft = 0; + m_armorRefineEffect = 0; + + m_sAlignment = 0; + m_byPKMode = 0; + m_isKiller = false; + m_isPartyMember = false; + + m_bEnableTCPState = TRUE; + + m_stName = ""; + + memset(m_awPart, 0, sizeof(m_awPart)); + memset(m_adwCRCAffectEffect, 0, sizeof(m_adwCRCAffectEffect)); + //memset(m_adwCRCEmoticonEffect, 0, sizeof(m_adwCRCEmoticonEffect)); + memset(&m_kMovAfterFunc, 0, sizeof(m_kMovAfterFunc)); + + m_bDamageEffectType = false; + m_dwDuelMode = DUEL_NONE; + m_dwEmoticonTime = 0; +} + +CInstanceBase::CInstanceBase() +{ + __Initialize(); +} + +CInstanceBase::~CInstanceBase() +{ + Destroy(); +} + + +void CInstanceBase::GetBoundBox(D3DXVECTOR3 * vtMin, D3DXVECTOR3 * vtMax) +{ + m_GraphicThingInstance.GetBoundBox(vtMin, vtMax); +} + +void CInstanceBase::SetLevel(DWORD dwLvl) +{ + m_dwLevel = dwLvl; +} diff --git a/extension/src/port/UserInterface/InstanceBase.h b/extension/src/port/UserInterface/InstanceBase.h index d5092600..7c3ea030 100644 --- a/extension/src/port/UserInterface/InstanceBase.h +++ b/extension/src/port/UserInterface/InstanceBase.h @@ -658,7 +658,7 @@ class CInstanceBase bool NEW_GetInstanceVectorInCircleRange(float fSkillDistance, std::vector* pkVct_pkInst); void NEW_SetOwner(DWORD dwOwnerVID); - void NEW_SyncPixelPosition(long & nPPosX, long & nPPosY); + void NEW_SyncPixelPosition(LONG & nPPosX, LONG & nPPosY); // PORT: 40250 Win32 long is 32-bit. void NEW_SyncCurrentPixelPosition(); void NEW_SetPixelPosition(const TPixelPosition& c_rkPPosDst); @@ -1129,4 +1129,4 @@ inline int RaceToSex(int race) } return 0; -} \ No newline at end of file +} diff --git a/extension/src/port/UserInterface/InstanceBaseMovement.cpp b/extension/src/port/UserInterface/InstanceBaseMovement.cpp new file mode 100644 index 00000000..2f43b1c0 --- /dev/null +++ b/extension/src/port/UserInterface/InstanceBaseMovement.cpp @@ -0,0 +1,356 @@ +#include "StdAfx.h" +#include "InstanceBase.h" +#include "PythonBackground.h" +#include "../EterLib/GrpMath.h" + +void CInstanceBase::SetAttackSpeed(UINT uAtkSpd) +{ + if (uAtkSpd > 1100) + uAtkSpd = 0; + + m_GraphicThingInstance.SetAttackSpeed(uAtkSpd/100.0f); + m_kHorse.SetAttackSpeed(uAtkSpd); +} + +void CInstanceBase::SetMoveSpeed(UINT uMovSpd) +{ + if (uMovSpd > 1100) + uMovSpd = 0; + + m_GraphicThingInstance.SetMoveSpeed(uMovSpd/100.0f); + m_kHorse.SetMoveSpeed(uMovSpd); +} + + +void CInstanceBase::SetRotationSpeed(float fRotSpd) +{ + m_fMaxRotSpd = fRotSpd; +} + +void CInstanceBase::NEW_Stop() +{ + if (__IsSyncing()) + return; + + if (isLock()) + return; + + if (IsUsingSkill()) + return; + + if (!IsWaiting()) + EndWalking(); + + m_GraphicThingInstance.__OnStop(); +} + +void CInstanceBase::NEW_SyncPixelPosition(LONG & nPPosX, LONG & nPPosY) // PORT: 40250 Win32 long is 32-bit. +{ + m_GraphicThingInstance.TEMP_Push(nPPosX, nPPosY); +} + +bool CInstanceBase::NEW_CanMoveToDestPixelPosition(const TPixelPosition& c_rkPPosDst) +{ + TPixelPosition kPPosCur; + NEW_GetPixelPosition(&kPPosCur); + + if (kPPosCur.x==c_rkPPosDst.x && kPPosCur.y==c_rkPPosDst.y) + return false; + + return true; +} + +float CInstanceBase_GetDegreeFromPosition(float x, float y) +{ + D3DXVECTOR3 vtDir(floor(x), floor(y), 0.0f); + D3DXVec3Normalize(&vtDir, &vtDir); + + D3DXVECTOR3 vtStan(0, -1, 0); + float ret = D3DXToDegree(acosf(D3DXVec3Dot(&vtDir, &vtStan))); + + if (vtDir.x < 0.0f) + ret = 360.0f - ret; + + return ret; +} + +float CInstanceBase::NEW_GetAdvancingRotationFromDirPixelPosition(const TPixelPosition& c_rkPPosDir) +{ + float fDirRot=CInstanceBase_GetDegreeFromPosition(c_rkPPosDir.x, -c_rkPPosDir.y); + float fClampDirRot=ClampDegree(fDirRot); + + return fClampDirRot; +} + +float CInstanceBase::NEW_GetAdvancingRotationFromDestPixelPosition(const TPixelPosition& c_rkPPosDst) +{ + TPixelPosition kPPosCur; + NEW_GetPixelPosition(&kPPosCur); + return NEW_GetAdvancingRotationFromPixelPosition(kPPosCur, c_rkPPosDst); +} + +float CInstanceBase::NEW_GetAdvancingRotationFromPixelPosition(const TPixelPosition& c_rkPPosSrc, const TPixelPosition& c_rkPPosDst) +{ + TPixelPosition kPPosDelta; + kPPosDelta=c_rkPPosDst-c_rkPPosSrc; + return NEW_GetAdvancingRotationFromDirPixelPosition(kPPosDelta); +} + + +void CInstanceBase::NEW_SetAdvancingRotationFromDirPixelPosition(const TPixelPosition& c_rkPPosDir) +{ + float fClampDirRot=NEW_GetAdvancingRotationFromDirPixelPosition(c_rkPPosDir); + m_GraphicThingInstance.SetAdvancingRotation(fClampDirRot); + + float fCurRot=m_GraphicThingInstance.GetRotation(); + float fAdvRot=m_GraphicThingInstance.GetAdvancingRotation(); + + m_iRotatingDirection = GetRotatingDirection(fCurRot, fAdvRot); +} + + +void CInstanceBase::NEW_SetAdvancingRotationFromPixelPosition(const TPixelPosition& c_rkPPosSrc, const TPixelPosition& c_rkPPosDst) +{ + TPixelPosition kPPosDelta; + kPPosDelta=c_rkPPosDst-c_rkPPosSrc; + + NEW_SetAdvancingRotationFromDirPixelPosition(kPPosDelta); +} + +bool CInstanceBase::NEW_SetAdvancingRotationFromDestPixelPosition(const TPixelPosition& c_rkPPosDst) +{ + if (!NEW_CanMoveToDestPixelPosition(c_rkPPosDst)) + { + Tracenf("Failed to move next position (%f,%f, %f)", c_rkPPosDst.x, c_rkPPosDst.y, c_rkPPosDst.z); + return false; + } + + TPixelPosition kPPosSrc; + NEW_GetPixelPosition(&kPPosSrc); + NEW_SetAdvancingRotationFromPixelPosition(kPPosSrc, c_rkPPosDst); + return true; +} + + +void CInstanceBase::SetAdvancingRotation(float fRotation) +{ + float frotDifference = GetDegreeDifference(GetRotation(), fRotation); + + if (frotDifference > 45.0f) + m_fRotSpd = m_fMaxRotSpd; + else + m_fRotSpd = m_fMaxRotSpd * 5 / 12; + + m_GraphicThingInstance.SetAdvancingRotation(ClampDegree(fRotation)); + m_iRotatingDirection = GetRotatingDirection(m_GraphicThingInstance.GetRotation(), + m_GraphicThingInstance.GetAdvancingRotation()); +} + +void CInstanceBase::StartWalking() +{ + m_GraphicThingInstance.Move(); + + if (IsAffect(AFFECT_GYEONGGONG)) + { + m_adwCRCAffectEffect[AFFECT_GYEONGGONG] = __EffectContainer_AttachEffect(EFFECT_AFFECT_GYEONGGONG); + } + else if (IsAffect(AFFECT_KWAESOK)) + { + m_adwCRCAffectEffect[AFFECT_KWAESOK] = __EffectContainer_AttachEffect(EFFECT_AFFECT_KWAESOK); + } +} + +void CInstanceBase::EndWalking(float fBlendingTime) +{ + assert (!IsWaiting() && "CInstanceBase::EndWalking"); + + m_isGoing = FALSE; + + // 걷고 있을때는 무조건 멈추게 해야 한다 + if (IsWalking()||!IsAttacked()) + { + m_GraphicThingInstance.Stop(fBlendingTime); + if (IsAffect(AFFECT_GYEONGGONG)) + { + __EffectContainer_DetachEffect(EFFECT_AFFECT_GYEONGGONG); + } + else if (IsAffect(AFFECT_KWAESOK)) + { + __EffectContainer_DetachEffect(EFFECT_AFFECT_KWAESOK); + } + } +} + +void CInstanceBase::EndWalkingWithoutBlending() +{ + EndWalking(0.0f); +} + +BOOL CInstanceBase::IsWaiting() +{ + return m_GraphicThingInstance.IsWaiting(); +} + +BOOL CInstanceBase::IsWalking() +{ + return m_GraphicThingInstance.IsMoving(); +} + +BOOL CInstanceBase::IsPushing() +{ + return m_GraphicThingInstance.IsPushing(); +} + +BOOL CInstanceBase::IsAttacked() +{ + return m_GraphicThingInstance.IsAttacked(); +} + +BOOL CInstanceBase::IsKnockDown() +{ + if (!m_GraphicThingInstance.IsKnockDown()) + return FALSE; + + return TRUE; +} + +BOOL CInstanceBase::IsAttacking() +{ + return m_GraphicThingInstance.isAttacking(); +} + +BOOL CInstanceBase::IsActingEmotion() +{ + return m_GraphicThingInstance.IsActEmotion(); +} + +/////////////////////////////////////////////////////////////////////////////////////////////////// + +BOOL CInstanceBase::IsGoing() +{ + return m_isGoing; +} + +void CInstanceBase::NEW_MoveToDestInstanceDirection(CInstanceBase & rkInstDst) +{ + TPixelPosition kPPosDst; + rkInstDst.NEW_GetPixelPosition(&kPPosDst); + + NEW_MoveToDestPixelPositionDirection(kPPosDst); +} + +bool CInstanceBase::NEW_MoveToDestPixelPositionDirection(const TPixelPosition & c_rkPPosDst) +{ + TPixelPosition kPPosCur; + NEW_GetPixelPosition(&kPPosCur); + float fDstRot = NEW_GetAdvancingRotationFromPixelPosition(kPPosCur, c_rkPPosDst); + + return NEW_Goto(c_rkPPosDst, fDstRot); +} + +bool CInstanceBase::NEW_Goto(const TPixelPosition& c_rkPPosDst, float fDstRot) +{ + if (__IsSyncing()) + { + return false; + } + + if (m_GraphicThingInstance.IsUsingMovingSkill()) + { + SetAdvancingRotation(fDstRot); + return true; + } + + if (isLock()) + { + return false; + } + + if (!NEW_CanMoveToDestPixelPosition(c_rkPPosDst)) + { + if (!IsWaiting()) + EndWalking(); + + return true; + } + + NEW_SetSrcPixelPosition(NEW_GetCurPixelPositionRef()); + NEW_SetDstPixelPosition(c_rkPPosDst); + NEW_SetDstPixelPositionZ(NEW_GetSrcPixelPositionRef().z); + m_fDstRot=fDstRot; + m_isGoing = TRUE; + + if (!IsWalking()) + { + StartWalking(); + } + + NEW_SetAdvancingRotationFromPixelPosition(NEW_GetSrcPixelPositionRef(), NEW_GetDstPixelPositionRef()); + + return true; +} + +void CInstanceBase::NEW_MoveToDirection(float fDirRot) +{ + if (__IsSyncing()) + return; + + if (m_GraphicThingInstance.IsUsingMovingSkill()) + { + SetAdvancingRotation(fDirRot); + return; + } + + if (isLock()) + return; + + m_isGoing = FALSE; + + SetAdvancingRotation(fDirRot); + + if (!IsWalking()) + { + StartWalking(); + } + + TPixelPosition kPPosCur; + NEW_GetPixelPosition(&kPPosCur); + + D3DXVECTOR3 kD3DVt3Cur(kPPosCur.x, -kPPosCur.y, kPPosCur.z); + D3DXVECTOR3 kD3DVt3Dst; + + D3DXVECTOR3 kD3DVt3AdvDir(0.0f, -1.0f, 0.0f); + D3DXMATRIX kD3DMatAdv; + D3DXMatrixRotationZ(&kD3DMatAdv, D3DXToRadian(fDirRot)); + D3DXVec3TransformCoord(&kD3DVt3AdvDir, &kD3DVt3AdvDir, &kD3DMatAdv); + D3DXVec3Scale(&kD3DVt3AdvDir, &kD3DVt3AdvDir, 300.0f); + D3DXVec3Add(&kD3DVt3Dst, &kD3DVt3AdvDir, &kD3DVt3Cur); + + TPixelPosition kPPosDst; + kPPosDst.x = +kD3DVt3Dst.x; + kPPosDst.y = -kD3DVt3Dst.y; + kPPosDst.z = +kD3DVt3Dst.z; + + NEW_SetSrcPixelPosition(kPPosCur); + NEW_SetDstPixelPosition(kPPosDst); +} + +void CInstanceBase::EndGoing() +{ + if (!IsWaiting()) + EndWalking(); + + //Tracen("EndGoing"); + + m_isGoing = FALSE; +} + +void CInstanceBase::SetRunMode() +{ + m_GraphicThingInstance.SetRunMode(); +} + +void CInstanceBase::SetWalkMode() +{ + m_GraphicThingInstance.SetWalkMode(); +} diff --git a/extension/src/port/UserInterface/NetworkActorManager.cpp b/extension/src/port/UserInterface/NetworkActorManager.cpp new file mode 100644 index 00000000..7b7806cf --- /dev/null +++ b/extension/src/port/UserInterface/NetworkActorManager.cpp @@ -0,0 +1,582 @@ +#include "StdAfx.h" +#include "NetworkActorManager.h" +#include "PythonCharacterManager.h" +#include "PythonItem.h" + +#include "AbstractPlayer.h" + +void SNetworkActorData::UpdatePosition() +{ + DWORD dwClientCurTime=ELTimer_GetMSec(); + DWORD dwElapsedTime=dwClientCurTime-m_dwClientSrcTime; + + if (dwElapsedTime::iterator i; + for (i=m_kNetActorDict.begin(); i!=m_kNetActorDict.end(); ++i) + { + SNetworkActorData& rkNetActorData=i->second; + rkNetActorData.UpdatePosition(); + + CInstanceBase * pkInstFind = rkChrMgr.GetInstancePtr(rkNetActorData.m_dwVID); + if (!pkInstFind) + { + if (__IsVisibleActor(rkNetActorData)) + __AppendCharacterManagerActor(rkNetActorData); + } + } +} + +CInstanceBase* CNetworkActorManager::__FindActor(SNetworkActorData& rkNetActorData, LONG lDstX, LONG lDstY) +{ + CPythonCharacterManager& rkChrMgr=__GetCharacterManager(); + CInstanceBase * pkInstFind = rkChrMgr.GetInstancePtr(rkNetActorData.m_dwVID); + if (!pkInstFind) + { + if (__IsVisiblePos(lDstX, lDstY)) + return __AppendCharacterManagerActor(rkNetActorData); + + return NULL; + } + + return pkInstFind; +} + +CInstanceBase* CNetworkActorManager::__FindActor(SNetworkActorData& rkNetActorData) +{ + CPythonCharacterManager& rkChrMgr=__GetCharacterManager(); + CInstanceBase * pkInstFind = rkChrMgr.GetInstancePtr(rkNetActorData.m_dwVID); + if (!pkInstFind) + { + if (__IsVisibleActor(rkNetActorData)) + return __AppendCharacterManagerActor(rkNetActorData); + + return NULL; + } + + return pkInstFind; +} + +void CNetworkActorManager::__RemoveAllGroundItems() +{ + CPythonItem& rkItemMgr=CPythonItem::Instance(); + rkItemMgr.DeleteAllItems(); +} + +void CNetworkActorManager::__RemoveAllActors() +{ + m_kNetActorDict.clear(); + + CPythonCharacterManager & rkChrMgr = CPythonCharacterManager::Instance(); + rkChrMgr.DeleteAllInstances(); +} + +void CNetworkActorManager::__RemoveDynamicActors() +{ + //copy it + std::vector dwCharacterVIDList; + + CPythonCharacterManager& rkChrMgr=CPythonCharacterManager::Instance(); + for(CPythonCharacterManager::CharacterIterator i = rkChrMgr.CharacterInstanceBegin(); i!=rkChrMgr.CharacterInstanceEnd(); ++i) + { + dwCharacterVIDList.push_back( (*i)->GetVirtualID() ); + } + + for( int i = 0; i < dwCharacterVIDList.size(); ++i ) + { + CInstanceBase* pkInstEach = rkChrMgr.GetInstancePtr( dwCharacterVIDList[i] ); + if( !pkInstEach ) + continue; + + CActorInstance* rkActorEach=pkInstEach->GetGraphicThingInstancePtr(); + if( rkActorEach->IsPC() || rkActorEach->IsNPC() || rkActorEach->IsEnemy() ) + { + rkChrMgr.DeleteInstance(dwCharacterVIDList[i]); + std::map::iterator it =m_kNetActorDict.find(dwCharacterVIDList[i]); + if (it != m_kNetActorDict.end()) + { + m_kNetActorDict.erase(it); + } + } + } + + rkChrMgr.DestroyDeadInstanceList(); +} + +void CNetworkActorManager::__UpdateMainActor() +{ + CPythonCharacterManager & rkChrMgr = CPythonCharacterManager::Instance(); + CInstanceBase* pkInstMain=rkChrMgr.GetMainInstancePtr(); + if (!pkInstMain) + return; + + TPixelPosition kPPosMain; + pkInstMain->NEW_GetPixelPosition(&kPPosMain); + + m_lMainPosX=LONG(kPPosMain.x); + m_lMainPosY=LONG(kPPosMain.y); +} + +extern bool IsWall(unsigned race); + +bool CNetworkActorManager::__IsVisibleActor(const SNetworkActorData& c_rkNetActorData) +{ + if (__IsMainActorVID(c_rkNetActorData.m_dwVID)) + return true; + + // 2004.08.02.myevan.항상 보이기 플래그 + if (c_rkNetActorData.m_kAffectFlags.IsSet(CInstanceBase::AFFECT_SHOW_ALWAYS)) + return true; + + if (__IsVisiblePos(c_rkNetActorData.m_lCurX, c_rkNetActorData.m_lCurY)) + return true; + + if (IsWall(c_rkNetActorData.m_dwRace)) + return true; + + return false; +} + +bool CNetworkActorManager::__IsVisiblePos(LONG lPosX, LONG lPosY) +{ + LONG dx = lPosX-m_lMainPosX; + LONG dy = lPosY-m_lMainPosY; + LONG len = (LONG)sqrt(double(dx * dx + dy * dy)); + + extern int CHAR_STAGE_VIEW_BOUND; + if (len < CHAR_STAGE_VIEW_BOUND) // 거리제한 cm + return true; + + return false; +} + +bool CNetworkActorManager::__IsMainActorVID(DWORD dwVID) +{ + if (dwVID == m_dwMainVID) + return true; + + return false; +} + +CPythonCharacterManager& CNetworkActorManager::__GetCharacterManager() +{ + return CPythonCharacterManager::Instance(); +} + +void CNetworkActorManager::__RemoveCharacterManagerActor(SNetworkActorData& rkNetActorData) +{ + CPythonCharacterManager & rkChrMgr = CPythonCharacterManager::Instance(); + + if (__IsMainActorVID(rkNetActorData.m_dwVID)) + { + rkChrMgr.DeleteInstance(rkNetActorData.m_dwVID); + } + else + { + rkChrMgr.DeleteInstanceByFade(rkNetActorData.m_dwVID); + } +} + +CInstanceBase* CNetworkActorManager::__AppendCharacterManagerActor(SNetworkActorData& rkNetActorData) +{ + Lognf(0, "CNetworkActorManager::__AppendCharacterManagerActor(%d, %s)", rkNetActorData.m_dwVID, rkNetActorData.m_stName.c_str()); + + DWORD dwVID=rkNetActorData.m_dwVID; + + CPythonCharacterManager & rkChrMgr = CPythonCharacterManager::Instance(); + + + CInstanceBase::SCreateData kCreateData; + kCreateData.m_bType=rkNetActorData.m_bType; + kCreateData.m_dwLevel=rkNetActorData.m_dwLevel; + kCreateData.m_dwGuildID=rkNetActorData.m_dwGuildID; + kCreateData.m_dwEmpireID=rkNetActorData.m_dwEmpireID; + kCreateData.m_dwVID=rkNetActorData.m_dwVID; + kCreateData.m_dwMountVnum=rkNetActorData.m_dwMountVnum; + kCreateData.m_dwRace=rkNetActorData.m_dwRace; + kCreateData.m_fRot=rkNetActorData.m_fRot; + kCreateData.m_lPosX=rkNetActorData.m_lCurX; + kCreateData.m_lPosY=rkNetActorData.m_lCurY; + kCreateData.m_stName=rkNetActorData.m_stName; + kCreateData.m_dwStateFlags=rkNetActorData.m_dwStateFlags; + kCreateData.m_dwMovSpd=rkNetActorData.m_dwMovSpd; + kCreateData.m_dwAtkSpd=rkNetActorData.m_dwAtkSpd; + kCreateData.m_sAlignment=rkNetActorData.m_sAlignment; + kCreateData.m_byPKMode=rkNetActorData.m_byPKMode; + kCreateData.m_kAffectFlags=rkNetActorData.m_kAffectFlags; + kCreateData.m_dwArmor=rkNetActorData.m_dwArmor; + kCreateData.m_dwWeapon=rkNetActorData.m_dwWeapon; + kCreateData.m_dwHair=rkNetActorData.m_dwHair; + kCreateData.m_isMain=__IsMainActorVID(dwVID); + + CInstanceBase* pOldInstance = rkChrMgr.GetInstancePtr(dwVID); + if (pOldInstance) + { + TPixelPosition oldPos; + pOldInstance->GetGraphicThingInstancePtr()->GetPixelPosition( &oldPos ); + + bool bIsMountingHorse = pOldInstance->IsMountingHorse(); + if( (bIsMountingHorse && kCreateData.m_dwMountVnum == 0) || + (!bIsMountingHorse && kCreateData.m_dwMountVnum != 0) ) + { + //Override Pos + kCreateData.m_lPosX = oldPos.x; + kCreateData.m_lPosY = -oldPos.y; + } + + rkChrMgr.DeleteInstance(dwVID); + } + + + CInstanceBase* pNewInstance = rkChrMgr.CreateInstance(kCreateData); + if (!pNewInstance) + return NULL; + + if (kCreateData.m_isMain) + { + IAbstractPlayer & rkPlayer = IAbstractPlayer::GetSingleton(); + rkPlayer.SetMainCharacterIndex(dwVID); + + + m_lMainPosX=rkNetActorData.m_lCurX; + m_lMainPosY=rkNetActorData.m_lCurY; + } + + DWORD dwClientCurTime=ELTimer_GetMSec(); + DWORD dwElapsedTime=dwClientCurTime-rkNetActorData.m_dwClientSrcTime; + + if (dwElapsedTimePushTCPState(rkNetActorData.m_dwServerSrcTime+dwElapsedTime, kPPosDst, rkNetActorData.m_fRot, CInstanceBase::FUNC_MOVE, 0); + } + return pNewInstance; +} + +void CNetworkActorManager::AppendActor(const SNetworkActorData& c_rkNetActorData) +{ + if (__IsMainActorVID(c_rkNetActorData.m_dwVID)) + { + bool bChangeMountStatus = false; + + CInstanceBase* pMainInstance = CPythonCharacterManager::Instance().GetInstancePtr(c_rkNetActorData.m_dwVID); + if( pMainInstance ) + { + bool bIsMountingHorse = pMainInstance->IsMountingHorse(); + bChangeMountStatus = (bIsMountingHorse && c_rkNetActorData.m_dwMountVnum == 0) || (!bIsMountingHorse && c_rkNetActorData.m_dwMountVnum != 0); + } + + if( !bChangeMountStatus ) + { + //__RemoveAllActors(); + __RemoveDynamicActors(); + __RemoveAllGroundItems(); + } + + } + + SNetworkActorData& rkNetActorData=m_kNetActorDict[c_rkNetActorData.m_dwVID]; + rkNetActorData=c_rkNetActorData; + + if (__IsVisibleActor(rkNetActorData)) + { + if (!__AppendCharacterManagerActor(rkNetActorData)) + m_kNetActorDict.erase(c_rkNetActorData.m_dwVID); + } +} + +void CNetworkActorManager::RemoveActor(DWORD dwVID) +{ + std::map::iterator f=m_kNetActorDict.find(dwVID); + if (m_kNetActorDict.end()==f) + { +#ifdef _DEBUG + TraceError("CNetworkActorManager::RemoveActor(dwVID=%d) - NOT EXIST VID", dwVID); +#endif + return; + } + + SNetworkActorData& rkNetActorData=f->second; + __RemoveCharacterManagerActor(rkNetActorData); + + m_kNetActorDict.erase(f); +} + +void CNetworkActorManager::UpdateActor(const SNetworkUpdateActorData& c_rkNetUpdateActorData) +{ + std::map::iterator f=m_kNetActorDict.find(c_rkNetUpdateActorData.m_dwVID); + if (m_kNetActorDict.end()==f) + { +#ifdef _DEBUG + TraceError("CNetworkActorManager::UpdateActor(dwVID=%d) - NOT EXIST VID", c_rkNetUpdateActorData.m_dwVID); +#endif + return; + } + + SNetworkActorData& rkNetActorData=f->second; + + CInstanceBase* pkInstFind=__FindActor(rkNetActorData); + if (pkInstFind) + { + pkInstFind->ChangeArmor(c_rkNetUpdateActorData.m_dwArmor); + pkInstFind->ChangeWeapon(c_rkNetUpdateActorData.m_dwWeapon); + pkInstFind->ChangeHair(c_rkNetUpdateActorData.m_dwHair); + pkInstFind->ChangeGuild(c_rkNetUpdateActorData.m_dwGuildID); + pkInstFind->SetAffectFlagContainer(c_rkNetUpdateActorData.m_kAffectFlags); + pkInstFind->SetMoveSpeed(c_rkNetUpdateActorData.m_dwMovSpd); + pkInstFind->SetAttackSpeed(c_rkNetUpdateActorData.m_dwAtkSpd); + pkInstFind->SetAlignment(c_rkNetUpdateActorData.m_sAlignment); + pkInstFind->SetPKMode(c_rkNetUpdateActorData.m_byPKMode); + pkInstFind->SetStateFlags(c_rkNetUpdateActorData.m_dwStateFlags); + + //if( c_rkNetUpdateActorData.m_dwMountVnum != 0 ) + //{ + // pkInstFind->MountHorse(c_rkNetUpdateActorData.m_dwMountVnum); + //} + //else + //{ + // if( pkInstFind->IsMountingHorse() ) + // { + // pkInstFind->DismountHorse(); + // } + //} + } + + rkNetActorData.m_kAffectFlags=c_rkNetUpdateActorData.m_kAffectFlags; + rkNetActorData.m_dwGuildID=c_rkNetUpdateActorData.m_dwGuildID; + //rkNetActorData.m_dwLevel=c_rkNetUpdateActorData.m_dwLevel; + rkNetActorData.m_dwMovSpd=c_rkNetUpdateActorData.m_dwMovSpd; + rkNetActorData.m_dwAtkSpd=c_rkNetUpdateActorData.m_dwAtkSpd; + rkNetActorData.m_dwArmor=c_rkNetUpdateActorData.m_dwArmor; + rkNetActorData.m_dwWeapon=c_rkNetUpdateActorData.m_dwWeapon; + rkNetActorData.m_dwHair=c_rkNetUpdateActorData.m_dwHair; + rkNetActorData.m_sAlignment=c_rkNetUpdateActorData.m_sAlignment; + rkNetActorData.m_byPKMode=c_rkNetUpdateActorData.m_byPKMode; +} + +void CNetworkActorManager::MoveActor(const SNetworkMoveActorData& c_rkNetMoveActorData) +{ + std::map::iterator f=m_kNetActorDict.find(c_rkNetMoveActorData.m_dwVID); + if (m_kNetActorDict.end()==f) + { +#ifdef _DEBUG + TraceError("CNetworkActorManager::MoveActor(dwVID=%d) - NOT EXIST VID", c_rkNetMoveActorData.m_dwVID); +#endif + return; + } + + SNetworkActorData& rkNetActorData=f->second; + + CInstanceBase* pkInstFind=__FindActor(rkNetActorData, c_rkNetMoveActorData.m_lPosX, c_rkNetMoveActorData.m_lPosY); + if (pkInstFind) + { + TPixelPosition kPPosDst; + kPPosDst.x=float(c_rkNetMoveActorData.m_lPosX); + kPPosDst.y=float(c_rkNetMoveActorData.m_lPosY); + kPPosDst.z=0.0f; + + pkInstFind->PushTCPState(c_rkNetMoveActorData.m_dwTime, kPPosDst, + c_rkNetMoveActorData.m_fRot, c_rkNetMoveActorData.m_dwFunc, c_rkNetMoveActorData.m_dwArg); + } + + rkNetActorData.SetDstPosition(c_rkNetMoveActorData.m_dwTime, + c_rkNetMoveActorData.m_lPosX, c_rkNetMoveActorData.m_lPosY, c_rkNetMoveActorData.m_dwDuration); + rkNetActorData.m_fRot=c_rkNetMoveActorData.m_fRot; +} + +void CNetworkActorManager::SyncActor(DWORD dwVID, LONG lPosX, LONG lPosY) +{ + std::map::iterator f=m_kNetActorDict.find(dwVID); + if (m_kNetActorDict.end()==f) + { +#ifdef _DEBUG + TraceError("CNetworkActorManager::SyncActor(dwVID=%d) - NOT EXIST VID", dwVID); +#endif + return; + } + + SNetworkActorData& rkNetActorData=f->second; + + CInstanceBase* pkInstFind=__FindActor(rkNetActorData); + if (pkInstFind) + { + pkInstFind->NEW_SyncPixelPosition(lPosX, lPosY); + } + + rkNetActorData.SetPosition(lPosX, lPosY); +} + +void CNetworkActorManager::SetActorOwner(DWORD dwOwnerVID, DWORD dwVictimVID) +{ + std::map::iterator f=m_kNetActorDict.find(dwVictimVID); + if (m_kNetActorDict.end()==f) + { +#ifdef _DEBUG + TraceError("CNetworkActorManager::SetActorOwner(dwOwnerVID=%d, dwVictimVID=%d) - NOT EXIST VID", dwOwnerVID, dwVictimVID); +#endif + return; + } + + SNetworkActorData& rkNetActorData=f->second; + rkNetActorData.m_dwOwnerVID=dwOwnerVID; + + CInstanceBase* pkInstFind=__FindActor(rkNetActorData); + if (pkInstFind) + { + pkInstFind->NEW_SetOwner(rkNetActorData.m_dwOwnerVID); + } + + +} diff --git a/extension/src/port/UserInterface/Packet.h b/extension/src/port/UserInterface/Packet.h index 408ec672..4e64975e 100644 --- a/extension/src/port/UserInterface/Packet.h +++ b/extension/src/port/UserInterface/Packet.h @@ -2319,8 +2319,9 @@ typedef struct SPacketGCShopSign typedef struct SPacketGCTime { BYTE bHeader; - time_t time; + LONG time; // PORT: _USE_32BIT_TIME_T in 40250 Win32; wire time is 32 bits on LP64. } TPacketGCTime; +static_assert(sizeof(TPacketGCTime) == 5); enum { diff --git a/extension/src/port/UserInterface/PythonCharacterManager.cpp b/extension/src/port/UserInterface/PythonCharacterManager.cpp new file mode 100644 index 00000000..60d6b799 --- /dev/null +++ b/extension/src/port/UserInterface/PythonCharacterManager.cpp @@ -0,0 +1,965 @@ +#include "StdAfx.h" +#include "PythonCharacterManager.h" +#include "PythonBackground.h" +#include "PythonNonPlayer.h" +#include "AbstractPlayer.h" +#include "Packet.h" + +#include "../EterLib/Camera.h" + +/////////////////////////////////////////////////////////////////////////////////////////////////// +// Frame Process + +int CHAR_STAGE_VIEW_BOUND = 200*100; + +struct FCharacterManagerCharacterInstanceUpdate +{ + inline void operator () (const std::pair& cr_Pair) + { + cr_Pair.second->Update(); + } +}; + +void CPythonCharacterManager::AdjustCollisionWithOtherObjects(CActorInstance* pInst ) +{ + if( !pInst->IsPC() ) + return; + + CPythonCharacterManager& rkChrMgr=CPythonCharacterManager::Instance(); + for(CPythonCharacterManager::CharacterIterator i = rkChrMgr.CharacterInstanceBegin(); i!=rkChrMgr.CharacterInstanceEnd();++i) + { + CInstanceBase* pkInstEach=*i; + CActorInstance* rkActorEach=pkInstEach->GetGraphicThingInstancePtr(); + + if (rkActorEach==pInst) + continue; + + if( rkActorEach->IsPC() || rkActorEach->IsNPC() || rkActorEach->IsEnemy() ) + continue; + + if(pInst->TestPhysicsBlendingCollision(*rkActorEach) ) + { + // NOTE : 일단 기존위치로 원복 + // TODO : 향후 조금더 잘 처리한다면 physic movement거리를 steping해서 iteration처리해야 함. + TPixelPosition curPos; + pInst->GetPixelPosition(&curPos); + pInst->SetBlendingPosition(curPos); + //Tracef("!!!!!! Collision Adjusted\n"); + break; + } + } +} + + +void CPythonCharacterManager::EnableSortRendering(bool isEnable) +{ +} + +void CPythonCharacterManager::InsertPVPKey(DWORD dwVIDSrc, DWORD dwVIDDst) +{ + CInstanceBase::InsertPVPKey(dwVIDSrc, dwVIDDst); + + CInstanceBase* pkInstSrc=GetInstancePtr(dwVIDSrc); + if (pkInstSrc) + pkInstSrc->RefreshTextTail(); + + CInstanceBase* pkInstDst=GetInstancePtr(dwVIDDst); + if (pkInstDst) + pkInstDst->RefreshTextTail(); +} + +void CPythonCharacterManager::RemovePVPKey(DWORD dwVIDSrc, DWORD dwVIDDst) +{ + CInstanceBase::RemovePVPKey(dwVIDSrc, dwVIDDst); + + CInstanceBase* pkInstSrc=GetInstancePtr(dwVIDSrc); + if (pkInstSrc) + pkInstSrc->RefreshTextTail(); + + CInstanceBase* pkInstDst=GetInstancePtr(dwVIDDst); + if (pkInstDst) + pkInstDst->RefreshTextTail(); +} + +void CPythonCharacterManager::ChangeGVG(DWORD dwSrcGuildID, DWORD dwDstGuildID) +{ + TCharacterInstanceMap::iterator itor; + for (itor = m_kAliveInstMap.begin(); itor != m_kAliveInstMap.end(); itor++) + { + CInstanceBase * pInstance = itor->second; + + DWORD dwInstanceGuildID = pInstance->GetGuildID(); + if (dwSrcGuildID == dwInstanceGuildID || dwDstGuildID == dwInstanceGuildID) + { + pInstance->RefreshTextTail(); + } + } +} + +void CPythonCharacterManager::ClearMainInstance() +{ + m_pkInstMain=NULL; +} + +bool CPythonCharacterManager::SetMainInstance(DWORD dwVID) +{ + m_pkInstMain=GetInstancePtr(dwVID); + + if (!m_pkInstMain) + return false; + + return true; +} + +CInstanceBase* CPythonCharacterManager::GetMainInstancePtr() +{ + return m_pkInstMain; +} + +void CPythonCharacterManager::GetInfo(std::string* pstInfo) +{ + pstInfo->append("Actor: "); + + CInstanceBase::GetInfo(pstInfo); + + char szInfo[256]; + sprintf(szInfo, "Container - Live %d, Dead %d", m_kAliveInstMap.size(), m_kDeadInstList.size()); + pstInfo->append(szInfo); +} + + +bool CPythonCharacterManager::IsCacheMode() +{ + static bool s_isOldCacheMode=false; + + bool isCacheMode=s_isOldCacheMode; + if (s_isOldCacheMode) + { + if (m_kAliveInstMap.size()<30) + isCacheMode=false; + } + else + { + if (m_kAliveInstMap.size()>40) + isCacheMode=true; + } + s_isOldCacheMode=isCacheMode; + + return isCacheMode; +} + +void CPythonCharacterManager::Update() +{ +#ifdef __PERFORMANCE_CHECKER__ + DWORD t1=timeGetTime(); +#endif + CInstanceBase::ResetPerformanceCounter(); + + CInstanceBase* pkInstMain=GetMainInstancePtr(); +#ifdef __PERFORMANCE_CHECKER__ + DWORD t2=timeGetTime(); +#endif + DWORD dwDeadInstCount=0; + DWORD dwForceVisibleInstCount=0; + + TCharacterInstanceMap::iterator i=m_kAliveInstMap.begin(); + while (m_kAliveInstMap.end()!=i) + { + TCharacterInstanceMap::iterator c=i++; + + CInstanceBase* pkInstEach=c->second; + pkInstEach->Update(); + + if (pkInstMain) + { + if (pkInstEach->IsForceVisible()) + { + dwForceVisibleInstCount++; + continue; + } + + int nDistance = int(pkInstEach->NEW_GetDistanceFromDestInstance(*pkInstMain)); + if (nDistance > CHAR_STAGE_VIEW_BOUND + 10) + { + __DeleteBlendOutInstance(pkInstEach); + m_kAliveInstMap.erase(c); + dwDeadInstCount++; + } + } + } +#ifdef __PERFORMANCE_CHECKER__ + DWORD t3=timeGetTime(); +#endif + UpdateTransform(); +#ifdef __PERFORMANCE_CHECKER__ + DWORD t4=timeGetTime(); +#endif + + UpdateDeleting(); +#ifdef __PERFORMANCE_CHECKER__ + DWORD t5=timeGetTime(); +#endif + + __NEW_Pick(); +#ifdef __PERFORMANCE_CHECKER__ + DWORD t6=timeGetTime(); +#endif + +#ifdef __PERFORMANCE_CHECKER__ + { + static FILE* fp=fopen("perf_chrmgr_update.txt", "w"); + + if (t6-t1>1) + { + fprintf(fp, "CU.Total %d (Time %d, Alive %d, Dead %d)\n", + t6-t1, ELTimer_GetMSec(), + m_kAliveInstMap.size(), + m_kDeadInstList.size()); + fprintf(fp, "CU.Counter %d\n", t2-t1); + fprintf(fp, "CU.ForEach %d\n", t3-t2); + fprintf(fp, "CU.Trans %d\n", t4-t3); + fprintf(fp, "CU.Del %d\n", t5-t4); + fprintf(fp, "CU.Pick %d\n", t6-t5); + fprintf(fp, "CU.AI %d\n", m_kAliveInstMap.size()); + fprintf(fp, "CU.DI %d\n", dwDeadInstCount); + fprintf(fp, "CU.FVI %d\n", dwForceVisibleInstCount); + fprintf(fp, "-------------------------------- \n"); + fflush(fp); + } + } +#endif +} + +void CPythonCharacterManager::ShowPointEffect(DWORD ePoint, DWORD dwVID) +{ + CInstanceBase * pkInstSel = (dwVID == 0xffffffff) ? GetMainInstancePtr() : GetInstancePtr(dwVID); + + if (!pkInstSel) + return; + + switch (ePoint) + { + case POINT_LEVEL: + pkInstSel->LevelUp(); + break; + case POINT_LEVEL_STEP: + pkInstSel->SkillUp(); + break; + } +} + +bool CPythonCharacterManager::RegisterPointEffect(DWORD ePoint, const char* c_szFileName) +{ + if (ePoint>=POINT_MAX_NUM) + return false; + + CEffectManager& rkEftMgr=CEffectManager::Instance(); + rkEftMgr.RegisterEffect2(c_szFileName, &m_adwPointEffect[ePoint]); + + return true; +} + +void CPythonCharacterManager::UpdateTransform() +{ +#ifdef __PERFORMANCE_CHECKER__ + DWORD t1=timeGetTime(); + DWORD t2=timeGetTime(); +#endif + + CInstanceBase * pMainInstance = GetMainInstancePtr(); + if (pMainInstance) + { + CPythonBackground& rkBG=CPythonBackground::Instance(); + for (TCharacterInstanceMap::iterator i = m_kAliveInstMap.begin(); i != m_kAliveInstMap.end(); ++i) + { + CInstanceBase * pSrcInstance = i->second; + + pSrcInstance->CheckAdvancing(); + + // 2004.08.02.myevan.IsAttacked 일 경우 죽었을때도 체크하므로, + // 실질적으로 거리가 변경되는 IsPushing일때만 체크하도록 한다 + if (pSrcInstance->IsPushing()) + rkBG.CheckAdvancing(pSrcInstance); + } +#ifdef __PERFORMANCE_CHECKER__ + t2=timeGetTime(); +#endif + +#ifdef __MOVIE_MODE__ + if (!m_pkInstMain->IsMovieMode()) + { + rkBG.CheckAdvancing(m_pkInstMain); + } +#else + rkBG.CheckAdvancing(m_pkInstMain); +#endif + } + +#ifdef __PERFORMANCE_CHECKER__ + DWORD t3=timeGetTime(); +#endif + + { + for (TCharacterInstanceMap::iterator itor = m_kAliveInstMap.begin(); itor != m_kAliveInstMap.end(); ++itor) + { + CInstanceBase * pInstance = itor->second; + pInstance->Transform(); + } + } + +#ifdef __PERFORMANCE_CHECKER__ + DWORD t4=timeGetTime(); +#endif + +#ifdef __PERFORMANCE_CHECKER__ + { + static FILE* fp=fopen("perf_chrmgr_updatetransform.txt", "w"); + + if (t4-t1>5) + { + fprintf(fp, "CUT.Total %d (Time %f, Alive %d, Dead %d)\n", + t4-t1, ELTimer_GetMSec()/1000.0f, + m_kAliveInstMap.size(), + m_kDeadInstList.size()); + fprintf(fp, "CUT.ChkAdvInst %d\n", t2-t1); + fprintf(fp, "CUT.ChkAdvBG %d\n", t3-t2); + fprintf(fp, "CUT.Trans %d\n", t4-t3); + + fprintf(fp, "-------------------------------- \n"); + fflush(fp); + } + + fflush(fp); + } +#endif +} +void CPythonCharacterManager::UpdateDeleting() +{ + TCharacterInstanceList::iterator itor = m_kDeadInstList.begin(); + for (; itor != m_kDeadInstList.end();) + { + CInstanceBase * pInstance = *itor; + + if (pInstance->UpdateDeleting()) + { + ++itor; + } + else + { + CInstanceBase::Delete(pInstance); + itor = m_kDeadInstList.erase(itor); + } + } +} + +struct FCharacterManagerCharacterInstanceDeform +{ + inline void operator () (const std::pair& cr_Pair) + { + cr_Pair.second->Deform(); + //pInstance->Update(); + } +}; +struct FCharacterManagerCharacterInstanceListDeform +{ + inline void operator () (CInstanceBase * pInstance) + { + pInstance->Deform(); + } +}; + +void CPythonCharacterManager::Deform() +{ + std::for_each(m_kAliveInstMap.begin(), m_kAliveInstMap.end(), FCharacterManagerCharacterInstanceDeform()); + std::for_each(m_kDeadInstList.begin(), m_kDeadInstList.end(), FCharacterManagerCharacterInstanceListDeform()); +} + + + + +bool CPythonCharacterManager::OLD_GetPickedInstanceVID(DWORD* pdwPickedActorID) +{ + if (!m_pkInstPick) + return false; + + *pdwPickedActorID=m_pkInstPick->GetVirtualID(); + return true; +} + +CInstanceBase * CPythonCharacterManager::OLD_GetPickedInstancePtr() +{ + return m_pkInstPick; +} + +D3DXVECTOR2 & CPythonCharacterManager::OLD_GetPickedInstPosReference() +{ + return m_v2PickedInstProjPos; +} + +bool CPythonCharacterManager::IsRegisteredVID(DWORD dwVID) +{ + if (m_kAliveInstMap.end()==m_kAliveInstMap.find(dwVID)) + return false; + + return true; +} + +bool CPythonCharacterManager::IsAliveVID(DWORD dwVID) +{ + return m_kAliveInstMap.find(dwVID)!=m_kAliveInstMap.end(); +} + +bool CPythonCharacterManager::IsDeadVID(DWORD dwVID) +{ + for (TCharacterInstanceList::iterator f=m_kDeadInstList.begin(); f!=m_kDeadInstList.end(); ++f) + { + if ((*f)->GetVirtualID()==dwVID) + return true; + } + + return false; +} + +struct LessCharacterInstancePtrRenderOrder +{ + bool operator() (CInstanceBase* pkLeft, CInstanceBase* pkRight) + { + return pkLeft->LessRenderOrder(pkRight); + } +}; + +struct FCharacterManagerCharacterInstanceRender +{ + inline void operator () (const std::pair& cr_Pair) + { + cr_Pair.second->Render(); + cr_Pair.second->RenderTrace(); + } +}; +struct FCharacterInstanceRender +{ + inline void operator () (CInstanceBase * pInstance) + { + pInstance->Render(); + } +}; +struct FCharacterInstanceRenderTrace +{ + inline void operator () (CInstanceBase * pInstance) + { + pInstance->RenderTrace(); + } +}; + + +void CPythonCharacterManager::__RenderSortedAliveActorList() +{ + static std::vector s_kVct_pkInstAliveSort; + s_kVct_pkInstAliveSort.clear(); + + TCharacterInstanceMap& rkMap_pkInstAlive=m_kAliveInstMap; + TCharacterInstanceMap::iterator i; + for (i=rkMap_pkInstAlive.begin(); i!=rkMap_pkInstAlive.end(); ++i) + s_kVct_pkInstAliveSort.push_back(i->second); + + std::sort(s_kVct_pkInstAliveSort.begin(), s_kVct_pkInstAliveSort.end(), LessCharacterInstancePtrRenderOrder()); + std::for_each(s_kVct_pkInstAliveSort.begin(), s_kVct_pkInstAliveSort.end(), FCharacterInstanceRender()); + std::for_each(s_kVct_pkInstAliveSort.begin(), s_kVct_pkInstAliveSort.end(), FCharacterInstanceRenderTrace()); +} + +void CPythonCharacterManager::__RenderSortedDeadActorList() +{ + static std::vector s_kVct_pkInstDeadSort; + s_kVct_pkInstDeadSort.clear(); + + TCharacterInstanceList& rkLst_pkInstDead=m_kDeadInstList; + TCharacterInstanceList::iterator i; + for (i=rkLst_pkInstDead.begin(); i!=rkLst_pkInstDead.end(); ++i) + s_kVct_pkInstDeadSort.push_back(*i); + + std::sort(s_kVct_pkInstDeadSort.begin(), s_kVct_pkInstDeadSort.end(), LessCharacterInstancePtrRenderOrder()); + std::for_each(s_kVct_pkInstDeadSort.begin(), s_kVct_pkInstDeadSort.end(), FCharacterInstanceRender()); + +} + +void CPythonCharacterManager::Render() +{ + STATEMANAGER.SetTexture(0, NULL); + STATEMANAGER.SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE); + STATEMANAGER.SetTextureStageState(0, D3DTSS_COLORARG2, D3DTA_CURRENT); + STATEMANAGER.SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_MODULATE); + STATEMANAGER.SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE); + STATEMANAGER.SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1); + + STATEMANAGER.SetTexture(1, NULL); + STATEMANAGER.SetTextureStageState(1, D3DTSS_COLOROP, D3DTOP_DISABLE); + STATEMANAGER.SetTextureStageState(1, D3DTSS_ALPHAOP, D3DTOP_DISABLE); + + + __RenderSortedAliveActorList(); + __RenderSortedDeadActorList(); + + CInstanceBase * pkPickedInst = OLD_GetPickedInstancePtr(); + if (pkPickedInst) + { + const D3DXVECTOR3 & c_rv3Position = pkPickedInst->GetGraphicThingInstanceRef().GetPosition(); + CPythonGraphic::Instance().ProjectPosition(c_rv3Position.x, c_rv3Position.y, c_rv3Position.z, &m_v2PickedInstProjPos.x, &m_v2PickedInstProjPos.y); + } +} + +void CPythonCharacterManager::RenderShadowMainInstance() +{ + CInstanceBase* pkInstMain=GetMainInstancePtr(); + if (pkInstMain) + pkInstMain->RenderToShadowMap(); +} + +struct FCharacterManagerCharacterInstanceRenderToShadowMap +{ + inline void operator () (const std::pair& cr_Pair) + { + cr_Pair.second->RenderToShadowMap(); + } +}; + +void CPythonCharacterManager::RenderShadowAllInstances() +{ + std::for_each(m_kAliveInstMap.begin(), m_kAliveInstMap.end(), FCharacterManagerCharacterInstanceRenderToShadowMap()); +} + +struct FCharacterManagerCharacterInstanceRenderCollision +{ + inline void operator () (const std::pair& cr_Pair) + { + cr_Pair.second->RenderCollision(); + } +}; + +void CPythonCharacterManager::RenderCollision() +{ + std::for_each(m_kAliveInstMap.begin(), m_kAliveInstMap.end(), FCharacterManagerCharacterInstanceRenderCollision()); +} + +/////////////////////////////////////////////////////////////////////////////////////////////////// +// Managing Process + +CInstanceBase * CPythonCharacterManager::CreateInstance(const CInstanceBase::SCreateData& c_rkCreateData) +{ + CInstanceBase * pCharacterInstance = RegisterInstance(c_rkCreateData.m_dwVID); + if (!pCharacterInstance) + { + TraceError("CPythonCharacterManager::CreateInstance: VID[%d] - ALREADY EXIST\n", c_rkCreateData.m_dwVID); // PORT: MSVC accepted a struct through varargs; pass the intended VID. + return NULL; + } + + if (!pCharacterInstance->Create(c_rkCreateData)) + { + TraceError("CPythonCharacterManager::CreateInstance VID[%d] Race[%d]", c_rkCreateData.m_dwVID, c_rkCreateData.m_dwRace); + DeleteInstance(c_rkCreateData.m_dwVID); + return NULL; + } + + if (c_rkCreateData.m_isMain) + SelectInstance(c_rkCreateData.m_dwVID); + + return (pCharacterInstance); +} + +CInstanceBase * CPythonCharacterManager::RegisterInstance(DWORD VirtualID) +{ + TCharacterInstanceMap::iterator itor = m_kAliveInstMap.find(VirtualID); + + if (m_kAliveInstMap.end() != itor) + { + return NULL; + } + + CInstanceBase * pCharacterInstance = CInstanceBase::New(); + m_kAliveInstMap.insert(TCharacterInstanceMap::value_type(VirtualID, pCharacterInstance)); + + return (pCharacterInstance); +} + +void CPythonCharacterManager::DeleteInstance(DWORD dwDelVID) +{ + TCharacterInstanceMap::iterator itor = m_kAliveInstMap.find(dwDelVID); + + if (m_kAliveInstMap.end() == itor) + { + Tracef("DeleteCharacterInstance: no vid by %d\n", dwDelVID); + return; + } + + CInstanceBase * pkInstDel = itor->second; + + if (pkInstDel == m_pkInstBind) + m_pkInstBind = NULL; + + if (pkInstDel == m_pkInstMain) + m_pkInstMain = NULL; + + if (pkInstDel == m_pkInstPick) + m_pkInstPick = NULL; + + CInstanceBase::Delete(pkInstDel); + + m_kAliveInstMap.erase(itor); +} + +void CPythonCharacterManager::__DeleteBlendOutInstance(CInstanceBase* pkInstDel) +{ + pkInstDel->DeleteBlendOut(); + m_kDeadInstList.push_back(pkInstDel); + + IAbstractPlayer& rkPlayer=IAbstractPlayer::GetSingleton(); + rkPlayer.NotifyCharacterDead(pkInstDel->GetVirtualID()); +} + +void CPythonCharacterManager::DeleteInstanceByFade(DWORD dwVID) +{ + TCharacterInstanceMap::iterator f = m_kAliveInstMap.find(dwVID); + if (m_kAliveInstMap.end() == f) + { + return; + } + __DeleteBlendOutInstance(f->second); + m_kAliveInstMap.erase(f); +} + +void CPythonCharacterManager::SelectInstance(DWORD VirtualID) +{ + TCharacterInstanceMap::iterator itor = m_kAliveInstMap.find(VirtualID); + + if (m_kAliveInstMap.end() == itor) + { + Tracef("SelectCharacterInstance: no vid by %d\n", VirtualID); + return; + } + + m_pkInstBind = itor->second; +} + +CInstanceBase * CPythonCharacterManager::GetInstancePtr(DWORD VirtualID) +{ + TCharacterInstanceMap::iterator itor = m_kAliveInstMap.find(VirtualID); + + if (m_kAliveInstMap.end() == itor) + return NULL; + + return itor->second; +} + +CInstanceBase * CPythonCharacterManager::GetInstancePtrByName(const char *name) +{ + TCharacterInstanceMap::iterator itor; + + for (itor = m_kAliveInstMap.begin(); itor != m_kAliveInstMap.end(); itor++) + { + CInstanceBase * pInstance = itor->second; + + if (!strcmp(pInstance->GetNameString(), name)) + return pInstance; + } + + return NULL; +} + +CInstanceBase * CPythonCharacterManager::GetSelectedInstancePtr() +{ + return m_pkInstBind; +} + +CInstanceBase* CPythonCharacterManager::FindClickableInstancePtr() +{ + return NULL; +} + +void CPythonCharacterManager::__UpdateSortPickedActorList() +{ + __UpdatePickedActorList(); + __SortPickedActorList(); +} + +void CPythonCharacterManager::__UpdatePickedActorList() +{ + m_kVct_pkInstPicked.clear(); + + TCharacterInstanceMap::iterator i; + for (i=m_kAliveInstMap.begin(); i!=m_kAliveInstMap.end(); ++i) + { + CInstanceBase* pkInstEach=i->second; + // 2004.07.17.levites.isShow를 ViewFrustumCheck로 변경 + if (pkInstEach->CanPickInstance()) + { + if (pkInstEach->IsDead()) + { + if (pkInstEach->IntersectBoundingBox()) + m_kVct_pkInstPicked.push_back(pkInstEach); + } + else + { + if (pkInstEach->IntersectDefendingSphere()) + m_kVct_pkInstPicked.push_back(pkInstEach); + } + } + } +} + +struct CInstanceBase_SLessCameraDistance +{ + TPixelPosition m_kPPosEye; + + bool operator() (CInstanceBase* pkInstLeft, CInstanceBase* pkInstRight) + { + int nLeftDeadPoint=pkInstLeft->IsDead(); + int nRightDeadPoint=pkInstRight->IsDead(); + + if (nLeftDeadPointCalculateDistanceSq3d(m_kPPosEye)CalculateDistanceSq3d(m_kPPosEye)) + return true; + + return false; + } +}; + +void CPythonCharacterManager::__SortPickedActorList() +{ + CCamera * pCamera = CCameraManager::Instance().GetCurrentCamera(); + const D3DXVECTOR3& c_rv3EyePos=pCamera->GetEye(); + + CInstanceBase_SLessCameraDistance kLess; + kLess.m_kPPosEye=TPixelPosition(+c_rv3EyePos.x, -c_rv3EyePos.y, +c_rv3EyePos.z); + + std::sort(m_kVct_pkInstPicked.begin(), m_kVct_pkInstPicked.end(), kLess); +} + +void CPythonCharacterManager::__NEW_Pick() +{ + __UpdateSortPickedActorList(); + + CInstanceBase* pkInstMain=GetMainInstancePtr(); + +#ifdef __MOVIE_MODE + if (pkInstMain) + if (pkInstMain->IsMovieMode()) + { + if (m_pkInstPick) + m_pkInstPick->OnUnselected(); + return; + } +#endif + + // 정밀한 체크 + { + std::vector::iterator f; + for (f=m_kVct_pkInstPicked.begin(); f!=m_kVct_pkInstPicked.end(); ++f) + { + CInstanceBase* pkInstEach=*f; + if (pkInstEach!=pkInstMain && pkInstEach->IntersectBoundingBox()) + { + if (m_pkInstPick) + if (m_pkInstPick!=pkInstEach) + m_pkInstPick->OnUnselected(); + + if (pkInstEach->CanPickInstance()) + { + m_pkInstPick = pkInstEach; + m_pkInstPick->OnSelected(); + return; + } + } + } + } + + // 못찾겠으면 걍 순서대로 + { + std::vector::iterator f; + for (f=m_kVct_pkInstPicked.begin(); f!=m_kVct_pkInstPicked.end(); ++f) + { + CInstanceBase* pkInstEach=*f; + if (pkInstEach!=pkInstMain) + { + if (m_pkInstPick) + if (m_pkInstPick!=pkInstEach) + m_pkInstPick->OnUnselected(); + + if (pkInstEach->CanPickInstance()) + { + m_pkInstPick = pkInstEach; + m_pkInstPick->OnSelected(); + return; + } + } + } + } + + if (pkInstMain) + if (pkInstMain->CanPickInstance()) + if (m_kVct_pkInstPicked.end() != std::find(m_kVct_pkInstPicked.begin(), m_kVct_pkInstPicked.end(), pkInstMain)) + { + if (m_pkInstPick) + if (m_pkInstPick!=pkInstMain) + m_pkInstPick->OnUnselected(); + + m_pkInstPick = pkInstMain; + m_pkInstPick->OnSelected(); + return; + } + + if (m_pkInstPick) + { + m_pkInstPick->OnUnselected(); + m_pkInstPick=NULL; + } +} + +void CPythonCharacterManager::__OLD_Pick() +{ + for (TCharacterInstanceMap::iterator itor = m_kAliveInstMap.begin(); itor != m_kAliveInstMap.end(); ++itor) + { + CInstanceBase * pkInstEach = itor->second; + + if (pkInstEach == m_pkInstMain) + continue; + + if (pkInstEach->IntersectDefendingSphere()) + { + if (m_pkInstPick) + if (m_pkInstPick!=pkInstEach) + m_pkInstPick->OnUnselected(); + + m_pkInstPick = pkInstEach; + m_pkInstPick->OnSelected(); + + return; + } + } + + if (m_pkInstPick) + { + m_pkInstPick->OnUnselected(); + m_pkInstPick=NULL; + } +} + +int CPythonCharacterManager::PickAll() +{ + for (TCharacterInstanceMap::iterator itor = m_kAliveInstMap.begin(); itor != m_kAliveInstMap.end(); ++itor) + { + CInstanceBase * pInstance = itor->second; + + if (pInstance->IntersectDefendingSphere()) + return pInstance->GetVirtualID(); + } + + return -1; +} + +CInstanceBase * CPythonCharacterManager::GetCloseInstance(CInstanceBase * pInstance) +{ + float fMinDistance = 10000.0f; + CInstanceBase * pCloseInstance = NULL; + + TCharacterInstanceMap::iterator itor = m_kAliveInstMap.begin(); + for (; itor != m_kAliveInstMap.end(); ++itor) + { + CInstanceBase * pTargetInstance = itor->second; + + if (pTargetInstance == pInstance) + continue; + + DWORD dwVirtualNumber = pTargetInstance->GetVirtualNumber(); + if (CPythonNonPlayer::ON_CLICK_EVENT_BATTLE != CPythonNonPlayer::Instance().GetEventType(dwVirtualNumber)) + continue; + + float fDistance = pInstance->GetDistance(pTargetInstance); + if (fDistance < fMinDistance) + { + fMinDistance = fDistance; + pCloseInstance = pTargetInstance; + } + } + + return pCloseInstance; +} + +void CPythonCharacterManager::RefreshAllPCTextTail() +{ + CPythonCharacterManager::CharacterIterator itor = CharacterInstanceBegin(); + CPythonCharacterManager::CharacterIterator itorEnd = CharacterInstanceEnd(); + for (; itor != itorEnd; ++itor) + { + CInstanceBase * pInstance = *itor; + if (!pInstance->IsPC()) + continue; + + pInstance->RefreshTextTail(); + } +} + +void CPythonCharacterManager::RefreshAllGuildMark() +{ + CPythonCharacterManager::CharacterIterator itor = CharacterInstanceBegin(); + CPythonCharacterManager::CharacterIterator itorEnd = CharacterInstanceEnd(); + for (; itor != itorEnd; ++itor) + { + CInstanceBase * pInstance = *itor; + if (!pInstance->IsPC()) + continue; + + pInstance->ChangeGuild(pInstance->GetGuildID()); + pInstance->RefreshTextTail(); + } +} + +void CPythonCharacterManager::DeleteAllInstances() +{ + DestroyAliveInstanceMap(); + DestroyDeadInstanceList(); +} + + +void CPythonCharacterManager::DestroyAliveInstanceMap() +{ + for (TCharacterInstanceMap::iterator i = m_kAliveInstMap.begin(); i != m_kAliveInstMap.end(); ++i) + CInstanceBase::Delete(i->second); + + m_kAliveInstMap.clear(); +} + +void CPythonCharacterManager::DestroyDeadInstanceList() +{ + std::for_each(m_kDeadInstList.begin(), m_kDeadInstList.end(), CInstanceBase::Delete); + m_kDeadInstList.clear(); +} + +void CPythonCharacterManager::Destroy() +{ + DeleteAllInstances(); + + CInstanceBase::DestroySystem(); + + __Initialize(); +} + +void CPythonCharacterManager::__Initialize() +{ + memset(m_adwPointEffect, 0, sizeof(m_adwPointEffect)); + m_pkInstMain = NULL; + m_pkInstBind = NULL; + m_pkInstPick = NULL; + m_v2PickedInstProjPos = D3DXVECTOR2(0.0f, 0.0f); +} + + +CPythonCharacterManager::CPythonCharacterManager() +{ + __Initialize(); +} + +CPythonCharacterManager::~CPythonCharacterManager() +{ + Destroy(); +} diff --git a/extension/src/port/UserInterface/PythonChat.cpp b/extension/src/port/UserInterface/PythonChat.cpp new file mode 100644 index 00000000..a870ba24 --- /dev/null +++ b/extension/src/port/UserInterface/PythonChat.cpp @@ -0,0 +1,834 @@ +#include "StdAfx.h" +#include "PythonChat.h" + +#include "AbstractApplication.h" +#include "PythonCharacterManager.h" +#include "../EterBase/Timer.h" + +int CPythonChat::TChatSet::ms_iChatModeSize = CHAT_TYPE_MAX_NUM; + +const float c_fStartDisappearingTime = 5.0f; +const int c_iMaxLineCount = 5; + +/////////////////////////////////////////////////////////////////////////////////////////////////// + +CDynamicPool CPythonChat::SChatLine::ms_kPool; + +void CPythonChat::SetChatColor(UINT eType, UINT r, UINT g, UINT b) +{ + if (eType>=CHAT_TYPE_MAX_NUM) + return; + + DWORD dwColor=(0xff000000)|(r<<16)|(g<<8)|(b); + m_akD3DXClrChat[eType]=D3DXCOLOR(dwColor); +} + +/////////////////////////////////////////////////////////////////////////////////////////////////// + +CPythonChat::SChatLine* CPythonChat::SChatLine::New() +{ + return ms_kPool.Alloc(); +} + +void CPythonChat::SChatLine::Delete(CPythonChat::SChatLine* pkChatLine) +{ + pkChatLine->Instance.Destroy(); + ms_kPool.Free(pkChatLine); +} + +void CPythonChat::SChatLine::DestroySystem() +{ + ms_kPool.Destroy(); +} + +void CPythonChat::SChatLine::SetColor(DWORD dwID, DWORD dwColor) +{ + assert(dwID < CHAT_LINE_COLOR_ARRAY_MAX_NUM); + + if (dwID >= CHAT_LINE_COLOR_ARRAY_MAX_NUM) + return; + + aColor[dwID] = dwColor; +} + +void CPythonChat::SChatLine::SetColorAll(DWORD dwColor) +{ + for (int i = 0; i < CHAT_LINE_COLOR_ARRAY_MAX_NUM; ++i) + aColor[i] = dwColor; +} + +D3DXCOLOR & CPythonChat::SChatLine::GetColorRef(DWORD dwID) +{ + assert(dwID < CHAT_LINE_COLOR_ARRAY_MAX_NUM); + + if (dwID >= CHAT_LINE_COLOR_ARRAY_MAX_NUM) + { + static D3DXCOLOR color(1.0f, 0.0f, 0.0f, 1.0f); + return color; + } + + return aColor[dwID]; +} + +CPythonChat::SChatLine::SChatLine() +{ + for (int i = 0; i < CHAT_LINE_COLOR_ARRAY_MAX_NUM; ++i) + aColor[i] = 0xff0000ff; +} +CPythonChat::SChatLine::~SChatLine() +{ + Instance.Destroy(); +} + +/////////////////////////////////////////////////////////////////////////////////////////////////// + +int CPythonChat::CreateChatSet(DWORD dwID) +{ + m_ChatSetMap.insert(std::make_pair(dwID, TChatSet())); + return dwID; +} + +void CPythonChat::UpdateViewMode(DWORD dwID) +{ + IAbstractApplication& rApp=IAbstractApplication::GetSingleton(); + + float fcurTime = rApp.GetGlobalTime(); + //float felapsedTime = rApp.GetGlobalElapsedTime(); + + TChatSet * pChatSet = GetChatSetPtr(dwID); + if (!pChatSet) + return; + + TChatLineList * pLineList = &(pChatSet->m_ShowingChatLineList); + int iLineIndex = pLineList->size(); + int iHeight = -(int(pLineList->size()+1) * pChatSet->m_iStep); + + TChatLineList::iterator itor; + for (itor = pLineList->begin(); itor != pLineList->end();) + { + TChatLine * pChatLine = (*itor); + + D3DXCOLOR & rColor = pChatLine->GetColorRef(dwID); + + float fElapsedTime = (fcurTime - pChatLine->fAppendedTime); + if (fElapsedTime >= c_fStartDisappearingTime || iLineIndex >= c_iMaxLineCount) + { + rColor.a -= rColor.a / 10.0f; + + if (rColor.a <= 0.1f) + { + itor = pLineList->erase(itor); + } + else + { + ++itor; + } + } + else + { + ++itor; + } + + ///// + + iHeight += pChatSet->m_iStep; + --iLineIndex; + + pChatLine->Instance.SetPosition(pChatSet->m_ix, pChatSet->m_iy + iHeight); + pChatLine->Instance.SetColor(rColor); + pChatLine->Instance.Update(); + } +} + +void CPythonChat::UpdateEditMode(DWORD dwID) +{ + TChatSet * pChatSet = GetChatSetPtr(dwID); + if (!pChatSet) + return; + + const int c_iAlphaLine = max(0, GetVisibleLineCount(dwID) - GetEditableLineCount(dwID) + 2); + + int iLineIndex = 0; + float fAlpha = 0.0f; + float fAlphaStep = 0.0f; + + if (c_iAlphaLine > 0) + fAlphaStep = 1.0f / float(c_iAlphaLine); + + TChatLineList * pLineList = &(pChatSet->m_ShowingChatLineList); + int iHeight = -(int(pLineList->size()+1) * pChatSet->m_iStep); + + for (TChatLineList::iterator itor = pLineList->begin(); itor != pLineList->end(); ++itor) + { + TChatLine * pChatLine = (*itor); + + D3DXCOLOR & rColor = pChatLine->GetColorRef(dwID); + + if (iLineIndex < c_iAlphaLine) + { + rColor.a += (fAlpha - rColor.a) / 10.0f; + fAlpha = fMIN(fAlpha+fAlphaStep, 1.0f); + } + else + { + rColor.a = fMIN(rColor.a+0.05f, 1.0f); + } + + iHeight += pChatSet->m_iStep; + pChatLine->Instance.SetPosition(pChatSet->m_ix, pChatSet->m_iy + iHeight); + pChatLine->Instance.SetColor(rColor); + pChatLine->Instance.Update(); + } +} + +void CPythonChat::UpdateLogMode(DWORD dwID) +{ + TChatSet * pChatSet = GetChatSetPtr(dwID); + if (!pChatSet) + return; + + TChatLineList * pLineList = &(pChatSet->m_ShowingChatLineList); + int iHeight = 0; + + for (TChatLineList::reverse_iterator itor = pLineList->rbegin(); itor != pLineList->rend(); ++itor) + { + TChatLine * pChatLine = (*itor); + + iHeight -= pChatSet->m_iStep; + pChatLine->Instance.SetPosition(pChatSet->m_ix, pChatSet->m_iy + iHeight); + pChatLine->Instance.SetColor(pChatLine->GetColorRef(dwID)); + pChatLine->Instance.Update(); + } +} + +void CPythonChat::Update(DWORD dwID) +{ + TChatSet * pChatSet = GetChatSetPtr(dwID); + if (!pChatSet) + return; + + switch (pChatSet->m_iBoardState) + { + case BOARD_STATE_VIEW: + UpdateViewMode(dwID); + break; + case BOARD_STATE_EDIT: + UpdateEditMode(dwID); + break; + case BOARD_STATE_LOG: + UpdateLogMode(dwID); + break; + } + + DWORD dwcurTime = CTimer::Instance().GetCurrentMillisecond(); + for (TWaitChatList::iterator itor = m_WaitChatList.begin(); itor != m_WaitChatList.end();) + { + TWaitChat & rWaitChat = *itor; + + if (rWaitChat.dwAppendingTime < dwcurTime) + { + AppendChat(rWaitChat.iType, rWaitChat.strChat.c_str()); + + itor = m_WaitChatList.erase(itor); + } + else + { + ++itor; + } + } +} + +void CPythonChat::Render(DWORD dwID) +{ + TChatLineList * pLineList = GetChatLineListPtr(dwID); + if (!pLineList) + return; + + for (TChatLineList::iterator itor = pLineList->begin(); itor != pLineList->end(); ++itor) + { + CGraphicTextInstance & rInstance = (*itor)->Instance; + rInstance.Render(); + } +} + + +void CPythonChat::SetBoardState(DWORD dwID, int iState) +{ + TChatSet * pChatSet = GetChatSetPtr(dwID); + if (!pChatSet) + return; + + pChatSet->m_iBoardState = iState; + ArrangeShowingChat(dwID); +} +void CPythonChat::SetPosition(DWORD dwID, int ix, int iy) +{ + TChatSet * pChatSet = GetChatSetPtr(dwID); + if (!pChatSet) + return; + + pChatSet->m_ix = ix; + pChatSet->m_iy = iy; +} +void CPythonChat::SetHeight(DWORD dwID, int iHeight) +{ + TChatSet * pChatSet = GetChatSetPtr(dwID); + if (!pChatSet) + return; + + pChatSet->m_iHeight = iHeight; +} +void CPythonChat::SetStep(DWORD dwID, int iStep) +{ + TChatSet * pChatSet = GetChatSetPtr(dwID); + if (!pChatSet) + return; + + pChatSet->m_iStep = iStep; +} +void CPythonChat::ToggleChatMode(DWORD dwID, int iMode) +{ + TChatSet * pChatSet = GetChatSetPtr(dwID); + if (!pChatSet) + return; + + pChatSet->m_iMode[iMode] = 1 - pChatSet->m_iMode[iMode]; +// Tracef("ToggleChatMode : %d\n", iMode); + ArrangeShowingChat(dwID); +} +void CPythonChat::EnableChatMode(DWORD dwID, int iMode) +{ + TChatSet * pChatSet = GetChatSetPtr(dwID); + if (!pChatSet) + return; + + pChatSet->m_iMode[iMode] = TRUE; +// Tracef("EnableChatMode : %d\n", iMode); + ArrangeShowingChat(dwID); +} +void CPythonChat::DisableChatMode(DWORD dwID, int iMode) +{ + TChatSet * pChatSet = GetChatSetPtr(dwID); + if (!pChatSet) + return; + + pChatSet->m_iMode[iMode] = FALSE; +// Tracef("DisableChatMode : %d\n", iMode); + ArrangeShowingChat(dwID); +} +void CPythonChat::SetEndPos(DWORD dwID, float fPos) +{ + TChatSet * pChatSet = GetChatSetPtr(dwID); + if (!pChatSet) + return; + + fPos = max(0.0f, fPos); + fPos = min(1.0f, fPos); + if (pChatSet->m_fEndPos != fPos) + { + pChatSet->m_fEndPos = fPos; + ArrangeShowingChat(dwID); + } +} + + +int CPythonChat::GetVisibleLineCount(DWORD dwID) +{ + TChatLineList * pLineList = GetChatLineListPtr(dwID); + if (!pLineList) + return 0; + + return pLineList->size(); +} + +int CPythonChat::GetEditableLineCount(DWORD dwID) +{ + TChatSet * pChatSet = GetChatSetPtr(dwID); + if (!pChatSet) + return 0; + + return pChatSet->m_iHeight / pChatSet->m_iStep + 1; +} + +int CPythonChat::GetLineCount(DWORD dwID) +{ + TChatSet * pChatSet = GetChatSetPtr(dwID); + if (!pChatSet) + return 0; + + int iCount = 0; + for (DWORD i = 0; i < m_ChatLineDeque.size(); ++i) + { + if (!pChatSet->CheckMode(m_ChatLineDeque[i]->iType)) + continue; + + ++iCount; + } + + return iCount; +} + +int CPythonChat::GetLineStep(DWORD dwID) +{ + TChatSet * pChatSet = GetChatSetPtr(dwID); + if (!pChatSet) + return 0; + + return pChatSet->m_iStep; +} + +CPythonChat::TChatLineList * CPythonChat::GetChatLineListPtr(DWORD dwID) +{ + TChatSetMap::iterator itor = m_ChatSetMap.find(dwID); + if (m_ChatSetMap.end() == itor) + return NULL; + + TChatSet & rChatSet = itor->second; + return &(rChatSet.m_ShowingChatLineList); +} + +CPythonChat::TChatSet * CPythonChat::GetChatSetPtr(DWORD dwID) +{ + TChatSetMap::iterator itor = m_ChatSetMap.find(dwID); + if (m_ChatSetMap.end() == itor) + return NULL; + + TChatSet & rChatSet = itor->second; + return &rChatSet; +} + +void CPythonChat::ArrangeShowingChat(DWORD dwID) +{ + TChatSet * pChatSet = GetChatSetPtr(dwID); + if (!pChatSet) + return; + + pChatSet->m_ShowingChatLineList.clear(); + + TChatLineDeque TempChatLineDeque; + for (TChatLineDeque::iterator itor = m_ChatLineDeque.begin(); itor != m_ChatLineDeque.end(); ++itor) + { + TChatLine * pChatLine = *itor; + if (pChatSet->CheckMode(pChatLine->iType)) + TempChatLineDeque.push_back(pChatLine); + } + + int icurLineCount = TempChatLineDeque.size(); + int iVisibleLineCount = min(icurLineCount, (pChatSet->m_iHeight + pChatSet->m_iStep) / pChatSet->m_iStep); + int iEndLine = iVisibleLineCount + int(float(icurLineCount - iVisibleLineCount - 1) * pChatSet->m_fEndPos); + + ///// + + int iHeight = 12; + for (int i = min(icurLineCount-1, iEndLine); i >= 0; --i) + { + if (!pChatSet->CheckMode(TempChatLineDeque[i]->iType)) + continue; + + if (pChatSet->m_iHeight + pChatSet->m_iStep <= iHeight) + { + break; + } + + pChatSet->m_ShowingChatLineList.push_front(TempChatLineDeque[i]); + + iHeight += pChatSet->m_iStep; + } +} + +void CPythonChat::AppendChat(int iType, const char * c_szChat) +{ + // DEFAULT_FONT + //static CResource * s_pResource = CResourceManager::Instance().GetResourcePointer(g_strDefaultFontName.c_str()); + + CGraphicText* pkDefaultFont = static_cast(DefaultFont_GetResource()); + if (!pkDefaultFont) + { + TraceError("CPythonChat::AppendChat - CANNOT_FIND_DEFAULT_FONT"); + return; + } + // END_OF_DEFAULT_FONT + + IAbstractApplication& rApp=IAbstractApplication::GetSingleton(); + SChatLine * pChatLine = SChatLine::New(); + pChatLine->iType = iType; + pChatLine->Instance.SetValue(c_szChat); + + // DEFAULT_FONT + pChatLine->Instance.SetTextPointer(pkDefaultFont); + // END_OF_DEFAULT_FONT + + pChatLine->fAppendedTime = rApp.GetGlobalTime(); + pChatLine->SetColorAll(GetChatColor(iType)); + + m_ChatLineDeque.push_back(pChatLine); + if (m_ChatLineDeque.size() > CHAT_LINE_MAX_NUM) + { + SChatLine * pChatLine = m_ChatLineDeque.front(); + SChatLine::Delete(pChatLine); + m_ChatLineDeque.pop_front(); + } + + for (TChatSetMap::iterator itor = m_ChatSetMap.begin(); itor != m_ChatSetMap.end(); ++itor) + { + TChatSet * pChatSet = &(itor->second); + //pChatLine->SetColor(itor->first, GetChatColor(iType)); + + // Edit Mode 를 억지로 끼워 맞추기 위해 추가 + if (BOARD_STATE_EDIT == pChatSet->m_iBoardState) + { + ArrangeShowingChat(itor->first); + } + else// if (BOARD_STATE_VIEW == pChatSet->m_iBoardState) + { + pChatSet->m_ShowingChatLineList.push_back(pChatLine); + if (pChatSet->m_ShowingChatLineList.size() > CHAT_LINE_MAX_NUM) + { + pChatSet->m_ShowingChatLineList.pop_front(); + } + } + } +} + +void CPythonChat::AppendChatWithDelay(int iType, const char * c_szChat, int iDelay) +{ + TWaitChat WaitChat; + WaitChat.iType = iType; + WaitChat.strChat = c_szChat; + WaitChat.dwAppendingTime = CTimer::Instance().GetCurrentMillisecond() + iDelay; + m_WaitChatList.push_back(WaitChat); +} + +DWORD CPythonChat::GetChatColor(int iType) +{ + if (iTypesecond; + } + + pWhisper->AppendChat(iType, c_szChat); +} + +void CPythonChat::ClearWhisper(const char * c_szName) +{ + TWhisperMap::iterator itor = m_WhisperMap.find(c_szName); + + if (itor != m_WhisperMap.end()) + { + CWhisper * pWhisper = itor->second; + CWhisper::Delete(pWhisper); + + m_WhisperMap.erase(itor); + } +} + +BOOL CPythonChat::GetWhisper(const char * c_szName, CWhisper ** ppWhisper) +{ + TWhisperMap::iterator itor = m_WhisperMap.find(c_szName); + + if (itor == m_WhisperMap.end()) + return FALSE; + + *ppWhisper = itor->second; + + return TRUE; +} + +void CPythonChat::InitWhisper(PyObject * ppyObject) +{ + TWhisperMap::iterator itor = m_WhisperMap.begin(); + for (; itor != m_WhisperMap.end(); ++itor) + { + std::string strName = itor->first; + PyCallClassMemberFunc(ppyObject, "MakeWhisperButton", Py_BuildValue("(s)", strName.c_str())); + } +} + +void CPythonChat::__DestroyWhisperMap() +{ + TWhisperMap::iterator itor = m_WhisperMap.begin(); + for (; itor != m_WhisperMap.end(); ++itor) + { + CWhisper::Delete(itor->second); + } + m_WhisperMap.clear(); +} + +void CPythonChat::Close() +{ + TChatSetMap::iterator itor = m_ChatSetMap.begin(); + for (; itor != m_ChatSetMap.end(); ++itor) + { + TChatSet & rChatSet = itor->second; + TChatLineList * pLineList = &(rChatSet.m_ShowingChatLineList); + for (TChatLineList::iterator itor = pLineList->begin(); itor != pLineList->end(); ++itor) + { + TChatLine * pChatLine = (*itor); + pChatLine->fAppendedTime = 0.0f; + } + } +} + +void CPythonChat::Destroy() +{ + __DestroyWhisperMap(); + + m_ShowingChatLineList.clear(); + m_ChatSetMap.clear(); + m_ChatLineDeque.clear(); + + SChatLine::DestroySystem(); + CWhisper::DestroySystem(); + + __Initialize(); +} + +void CPythonChat::__Initialize() +{ + m_akD3DXClrChat[CHAT_TYPE_TALKING] = D3DXCOLOR(1.0f, 1.0f, 1.0f, 1.0f); + m_akD3DXClrChat[CHAT_TYPE_INFO] = D3DXCOLOR(1.0f, 0.785f, 0.785f, 1.0f); + m_akD3DXClrChat[CHAT_TYPE_NOTICE] = D3DXCOLOR(1.0f, 0.902f, 0.730f, 1.0f); + m_akD3DXClrChat[CHAT_TYPE_PARTY] = D3DXCOLOR(0.542f, 1.0f, 0.949f, 1.0f); + m_akD3DXClrChat[CHAT_TYPE_GUILD] = D3DXCOLOR(0.906f, 0.847f, 1.0f, 1.0f); + m_akD3DXClrChat[CHAT_TYPE_COMMAND] = D3DXCOLOR(0.658f, 1.0f, 0.835f, 1.0f); + m_akD3DXClrChat[CHAT_TYPE_SHOUT] = D3DXCOLOR(0.658f, 1.0f, 0.835f, 1.0f); + m_akD3DXClrChat[CHAT_TYPE_WHISPER] = D3DXCOLOR(0xff4AE14A); + m_akD3DXClrChat[CHAT_TYPE_BIG_NOTICE] = D3DXCOLOR(1.0f, 0.902f, 0.730f, 1.0f); +} + +CPythonChat::CPythonChat() +{ + __Initialize(); +} + +CPythonChat::~CPythonChat() +{ + assert(m_ChatLineDeque.empty()); + assert(m_ShowingChatLineList.empty()); + assert(m_ChatSetMap.empty()); + assert(m_WhisperMap.empty()); +} + +/////////////////////////////////////////////////////////////////////////////////////////////////// +CDynamicPool CWhisper::ms_kPool; + +CWhisper* CWhisper::New() +{ + return ms_kPool.Alloc(); +} + +void CWhisper::Delete(CWhisper* pkWhisper) +{ + pkWhisper->Destroy(); + ms_kPool.Free(pkWhisper); +} + +void CWhisper::DestroySystem() +{ + ms_kPool.Destroy(); + + SChatLine::DestroySystem(); +} + +void CWhisper::SetPosition(float fPosition) +{ + m_fcurPosition = fPosition; + __ArrangeChat(); +} + +void CWhisper::SetBoxSize(float fWidth, float fHeight) +{ + m_fWidth = fWidth; + m_fHeight = fHeight; + + for (TChatLineDeque::iterator itor = m_ChatLineDeque.begin(); itor != m_ChatLineDeque.end(); ++itor) + { + TChatLine * pChatLine = *itor; + pChatLine->Instance.SetLimitWidth(fWidth); + } +} + +void CWhisper::AppendChat(int iType, const char * c_szChat) +{ + // DEFAULT_FONT + //static CResource * s_pResource = CResourceManager::Instance().GetResourcePointer(g_strDefaultFontName.c_str()); + +#if defined(LOCALE_SERVICE_YMIR) || defined(LOCALE_SERVICE_JAPAN) || defined(LOCALE_SERVICE_HONGKONG) || defined(LOCALE_SERVICE_TAIWAN) || defined(LOCALE_SERVICE_NEWCIBN) + CGraphicText* pkDefaultFont = static_cast(DefaultFont_GetResource()); +#else + CGraphicText* pkDefaultFont = (iType == CPythonChat::WHISPER_TYPE_GM) ? static_cast(DefaultItalicFont_GetResource()) : static_cast(DefaultFont_GetResource()); +#endif + + if (!pkDefaultFont) + { + TraceError("CWhisper::AppendChat - CANNOT_FIND_DEFAULT_FONT"); + return; + } + // END_OF_DEFAULT_FONT + + SChatLine * pChatLine = SChatLine::New(); + pChatLine->Instance.SetValue(c_szChat); + + // DEFAULT_FONT + pChatLine->Instance.SetTextPointer(pkDefaultFont); + // END_OF_DEFAULT_FONT + + pChatLine->Instance.SetLimitWidth(m_fWidth); + pChatLine->Instance.SetMultiLine(TRUE); + + switch(iType) + { + case CPythonChat::WHISPER_TYPE_SYSTEM: + pChatLine->Instance.SetColor(D3DXCOLOR(1.0f, 0.785f, 0.785f, 1.0f)); + break; + case CPythonChat::WHISPER_TYPE_GM: + pChatLine->Instance.SetColor(D3DXCOLOR(1.0f, 0.632f, 0.0f, 1.0f)); + break; + case CPythonChat::WHISPER_TYPE_CHAT: + default: + pChatLine->Instance.SetColor(0xffffffff); + break; + } + + m_ChatLineDeque.push_back(pChatLine); + + __ArrangeChat(); +} + +void CWhisper::__ArrangeChat() +{ + for (TChatLineDeque::iterator itor = m_ChatLineDeque.begin(); itor != m_ChatLineDeque.end(); ++itor) + { + TChatLine * pChatLine = *itor; + pChatLine->Instance.Update(); + } +} + +void CWhisper::Render(float fx, float fy) +{ + float fHeight = fy + m_fHeight; + + int iViewCount = int(m_fHeight / m_fLineStep) - 1; + int iLineCount = int(m_ChatLineDeque.size()); + int iStartLine = -1; + if (iLineCount > iViewCount) + { + iStartLine = int(float(iLineCount-iViewCount) * m_fcurPosition) + iViewCount - 1; + } + else if (!m_ChatLineDeque.empty()) + { + iStartLine = iLineCount - 1; + } + + // PORT: RECT holds the 32-bit Win32 LONG, so static_cast would narrow here. + RECT Rect = { static_cast(fx), static_cast(fy), static_cast(fx+m_fWidth), static_cast(fy+m_fHeight) }; + + for (int i = iStartLine; i >= 0; --i) + { + assert(i >= 0 && i < int(m_ChatLineDeque.size())); + TChatLine * pChatLine = m_ChatLineDeque[i]; + + WORD wLineCount = pChatLine->Instance.GetTextLineCount(); + fHeight -= wLineCount * m_fLineStep; + + pChatLine->Instance.SetPosition(fx, fHeight); + pChatLine->Instance.Render(&Rect); + + if (fHeight < fy) + break; + } +} + +void CWhisper::__Initialize() +{ + m_fLineStep = 15.0f; + m_fWidth = 300.0f; + m_fHeight = 120.0f; + m_fcurPosition = 1.0f; +} + +void CWhisper::Destroy() +{ + std::for_each(m_ChatLineDeque.begin(), m_ChatLineDeque.end(), SChatLine::Delete); + m_ChatLineDeque.clear(); + m_ShowingChatLineList.clear(); +} + +CWhisper::CWhisper() +{ + __Initialize(); +} + +CWhisper::~CWhisper() +{ + Destroy(); +} + +/////////////////////////////////////////////////////////////////////////////////////////////////// + +CDynamicPool CWhisper::SChatLine::ms_kPool; + +CWhisper::SChatLine* CWhisper::SChatLine::New() +{ + return ms_kPool.Alloc(); +} + +void CWhisper::SChatLine::Delete(CWhisper::SChatLine* pkChatLine) +{ + pkChatLine->Instance.Destroy(); + ms_kPool.Free(pkChatLine); +} + +void CWhisper::SChatLine::DestroySystem() +{ + ms_kPool.Destroy(); +} diff --git a/extension/src/port/UserInterface/PythonChatModule.cpp b/extension/src/port/UserInterface/PythonChatModule.cpp new file mode 100644 index 00000000..41b63b4c --- /dev/null +++ b/extension/src/port/UserInterface/PythonChatModule.cpp @@ -0,0 +1,520 @@ +#include "StdAfx.h" +#include "PythonChat.h" +#include "PythonItem.h" +#include "../GameLib/ItemManager.h" + +PyObject * chatSetChatColor(PyObject* poSelf, PyObject* poArgs) +{ + int iType; + if (!PyTuple_GetInteger(poArgs, 0, &iType)) + return Py_BuildException(); + + int r; + if (!PyTuple_GetInteger(poArgs, 1, &r)) + return Py_BuildException(); + + int g; + if (!PyTuple_GetInteger(poArgs, 2, &g)) + return Py_BuildException(); + + int b; + if (!PyTuple_GetInteger(poArgs, 3, &b)) + return Py_BuildException(); + + CPythonChat::Instance().SetChatColor(iType, r, g, b); + return Py_BuildNone(); +} + +PyObject * chatClear(PyObject* poSelf, PyObject* poArgs) +{ + CPythonChat::Instance().Destroy(); + return Py_BuildNone(); +} + +PyObject * chatClose(PyObject* poSelf, PyObject* poArgs) +{ + CPythonChat::Instance().Close(); + return Py_BuildNone(); +} + +PyObject * chatCreateChatSet(PyObject* poSelf, PyObject* poArgs) +{ + int iID; + if (!PyTuple_GetInteger(poArgs, 0, &iID)) + return Py_BuildException(); + + return Py_BuildValue("i", CPythonChat::Instance().CreateChatSet(iID)); +} + +PyObject * chatUpdate(PyObject* poSelf, PyObject* poArgs) +{ + int iID; + if (!PyTuple_GetInteger(poArgs, 0, &iID)) + return Py_BuildException(); + + CPythonChat::Instance().Update(iID); + return Py_BuildNone(); +} + +PyObject * chatRender(PyObject* poSelf, PyObject* poArgs) +{ + int iID; + if (!PyTuple_GetInteger(poArgs, 0, &iID)) + return Py_BuildException(); + + CPythonChat::Instance().Render(iID); + return Py_BuildNone(); +} + +PyObject * chatSetBoardState(PyObject* poSelf, PyObject* poArgs) +{ + int iID; + if (!PyTuple_GetInteger(poArgs, 0, &iID)) + return Py_BuildException(); + int iState; + if (!PyTuple_GetInteger(poArgs, 1, &iState)) + return Py_BuildException(); + + CPythonChat::Instance().SetBoardState(iID, iState); + + return Py_BuildNone(); +} + +PyObject * chatSetPosition(PyObject* poSelf, PyObject* poArgs) +{ + int iID; + if (!PyTuple_GetInteger(poArgs, 0, &iID)) + return Py_BuildException(); + int ix; + if (!PyTuple_GetInteger(poArgs, 1, &ix)) + return Py_BuildException(); + int iy; + if (!PyTuple_GetInteger(poArgs, 2, &iy)) + return Py_BuildException(); + + CPythonChat::Instance().SetPosition(iID, ix, iy); + + return Py_BuildNone(); +} + +PyObject * chatSetHeight(PyObject* poSelf, PyObject* poArgs) +{ + int iID; + if (!PyTuple_GetInteger(poArgs, 0, &iID)) + return Py_BuildException(); + int iHeight; + if (!PyTuple_GetInteger(poArgs, 1, &iHeight)) + return Py_BuildException(); + + CPythonChat::Instance().SetHeight(iID, iHeight); + + return Py_BuildNone(); +} + +PyObject * chatSetStep(PyObject* poSelf, PyObject* poArgs) +{ + int iID; + if (!PyTuple_GetInteger(poArgs, 0, &iID)) + return Py_BuildException(); + int iStep; + if (!PyTuple_GetInteger(poArgs, 1, &iStep)) + return Py_BuildException(); + + CPythonChat::Instance().SetStep(iID, iStep); + + return Py_BuildNone(); +} + +PyObject * chatToggleChatMode(PyObject* poSelf, PyObject* poArgs) +{ + int iID; + if (!PyTuple_GetInteger(poArgs, 0, &iID)) + return Py_BuildException(); + int iType; + if (!PyTuple_GetInteger(poArgs, 1, &iType)) + return Py_BuildException(); + + CPythonChat::Instance().ToggleChatMode(iID, iType); + + return Py_BuildNone(); +} + +PyObject * chatEnableChatMode(PyObject* poSelf, PyObject* poArgs) +{ + int iID; + if (!PyTuple_GetInteger(poArgs, 0, &iID)) + return Py_BuildException(); + int iType; + if (!PyTuple_GetInteger(poArgs, 1, &iType)) + return Py_BuildException(); + + CPythonChat::Instance().EnableChatMode(iID, iType); + + return Py_BuildNone(); +} + +PyObject * chatDisableChatMode(PyObject* poSelf, PyObject* poArgs) +{ + int iID; + if (!PyTuple_GetInteger(poArgs, 0, &iID)) + return Py_BuildException(); + int iType; + if (!PyTuple_GetInteger(poArgs, 1, &iType)) + return Py_BuildException(); + + CPythonChat::Instance().DisableChatMode(iID, iType); + + return Py_BuildNone(); +} + +PyObject * chatSetEndPos(PyObject* poSelf, PyObject* poArgs) +{ + int iID; + if (!PyTuple_GetInteger(poArgs, 0, &iID)) + return Py_BuildException(); + float fPos; + if (!PyTuple_GetFloat(poArgs, 1, &fPos)) + return Py_BuildException(); + + CPythonChat::Instance().SetEndPos(iID, fPos); + + return Py_BuildNone(); +} + +PyObject * chatGetLineCount(PyObject* poSelf, PyObject* poArgs) +{ + int iID; + if (!PyTuple_GetInteger(poArgs, 0, &iID)) + return Py_BuildException(); + + return Py_BuildValue("i", CPythonChat::Instance().GetLineCount(iID)); +} + +PyObject * chatGetVisibleLineCount(PyObject* poSelf, PyObject* poArgs) +{ + int iID; + if (!PyTuple_GetInteger(poArgs, 0, &iID)) + return Py_BuildException(); + + return Py_BuildValue("i", CPythonChat::Instance().GetVisibleLineCount(iID)); +} + +PyObject * chatGetLineStep(PyObject* poSelf, PyObject* poArgs) +{ + int iID; + if (!PyTuple_GetInteger(poArgs, 0, &iID)) + return Py_BuildException(); + + return Py_BuildValue("i", CPythonChat::Instance().GetLineStep(iID)); +} + +PyObject * chatAppendChat(PyObject* poSelf, PyObject* poArgs) +{ + int iType; + if (!PyTuple_GetInteger(poArgs, 0, &iType)) + return Py_BuildException(); + + char * szChat; + if (!PyTuple_GetString(poArgs, 1, &szChat)) + return Py_BuildException(); + + CPythonChat::Instance().AppendChat(iType, szChat); + + return Py_BuildNone(); +} + +PyObject * chatAppendChatWithDelay(PyObject* poSelf, PyObject* poArgs) +{ + int iType; + if (!PyTuple_GetInteger(poArgs, 0, &iType)) + return Py_BuildException(); + + char * szChat; + if (!PyTuple_GetString(poArgs, 1, &szChat)) + return Py_BuildException(); + + int iDelay; + if (!PyTuple_GetInteger(poArgs, 2, &iDelay)) + return Py_BuildException(); + + CPythonChat::Instance().AppendChatWithDelay(iType, szChat, iDelay); + + return Py_BuildNone(); +} + +PyObject * chatArrangeShowingChat(PyObject* poSelf, PyObject* poArgs) +{ + int iID; + if (!PyTuple_GetInteger(poArgs, 0, &iID)) + return Py_BuildException(); + + CPythonChat::Instance().ArrangeShowingChat(iID); + + return Py_BuildNone(); +} + +PyObject * chatIgnoreCharacter(PyObject* poSelf, PyObject* poArgs) +{ + char * szName; + if (!PyTuple_GetString(poArgs, 0, &szName)) + return Py_BuildException(); + + CPythonChat::Instance().IgnoreCharacter(szName); + + return Py_BuildNone(); +} + +PyObject * chatIsIgnoreCharacter(PyObject* poSelf, PyObject* poArgs) +{ + char * szName; + if (!PyTuple_GetString(poArgs, 0, &szName)) + return Py_BuildException(); + + CPythonChat::Instance().IsIgnoreCharacter(szName); + + return Py_BuildNone(); +} + +PyObject * chatCreateWhisper(PyObject* poSelf, PyObject* poArgs) +{ + char * szName; + if (!PyTuple_GetString(poArgs, 0, &szName)) + return Py_BuildException(); + + CPythonChat::Instance().CreateWhisper(szName); + + return Py_BuildNone(); +} + +PyObject * chatAppendWhisper(PyObject* poSelf, PyObject* poArgs) +{ + int iType; + if (!PyTuple_GetInteger(poArgs, 0, &iType)) + return Py_BuildException(); + + char * szName; + if (!PyTuple_GetString(poArgs, 1, &szName)) + return Py_BuildException(); + + char * szChat; + if (!PyTuple_GetString(poArgs, 2, &szChat)) + return Py_BuildException(); + + CPythonChat::Instance().AppendWhisper(iType, szName, szChat); + return Py_BuildNone(); +} + +PyObject * chatRenderWhisper(PyObject* poSelf, PyObject* poArgs) +{ + char * szName; + if (!PyTuple_GetString(poArgs, 0, &szName)) + return Py_BuildException(); + + float fx; + if (!PyTuple_GetFloat(poArgs, 1, &fx)) + return Py_BuildException(); + + float fy; + if (!PyTuple_GetFloat(poArgs, 2, &fy)) + return Py_BuildException(); + + CWhisper * pWhisper; + if (CPythonChat::Instance().GetWhisper(szName, &pWhisper)) + { + pWhisper->Render(fx, fy); + } + + return Py_BuildNone(); +} + +PyObject * chatSetWhisperBoxSize(PyObject* poSelf, PyObject* poArgs) +{ + char * szName; + if (!PyTuple_GetString(poArgs, 0, &szName)) + return Py_BuildException(); + + float fWidth; + if (!PyTuple_GetFloat(poArgs, 1, &fWidth)) + return Py_BuildException(); + + float fHeight; + if (!PyTuple_GetFloat(poArgs, 2, &fHeight)) + return Py_BuildException(); + + CWhisper * pWhisper; + if (CPythonChat::Instance().GetWhisper(szName, &pWhisper)) + { + pWhisper->SetBoxSize(fWidth, fHeight); + } + + return Py_BuildNone(); +} + +PyObject * chatSetWhisperPosition(PyObject* poSelf, PyObject* poArgs) +{ + char * szName; + if (!PyTuple_GetString(poArgs, 0, &szName)) + return Py_BuildException(); + + float fPosition; + if (!PyTuple_GetFloat(poArgs, 1, &fPosition)) + return Py_BuildException(); + + CWhisper * pWhisper; + if (CPythonChat::Instance().GetWhisper(szName, &pWhisper)) + { + pWhisper->SetPosition(fPosition); + } + + return Py_BuildNone(); +} + +PyObject * chatClearWhisper(PyObject* poSelf, PyObject* poArgs) +{ + char * szName; + if (!PyTuple_GetString(poArgs, 0, &szName)) + return Py_BuildException(); + + CPythonChat::Instance().ClearWhisper(szName); + + return Py_BuildNone(); +} + +PyObject * chatInitWhisper(PyObject* poSelf, PyObject* poArgs) +{ + PyObject * poInterface; + if (!PyTuple_GetObject(poArgs, 0, &poInterface)) + return Py_BuildException(); + + CPythonChat::Instance().InitWhisper(poInterface); + return Py_BuildNone(); +} + +PyObject * chatGetLinkFromHyperlink(PyObject * poSelf, PyObject * poArgs) +{ + char * szHyperlink; + + if (!PyTuple_GetString(poArgs, 0, &szHyperlink)) + return Py_BuildException(); + + std::string stHyperlink(szHyperlink); + std::vector results; + + split_string(stHyperlink, ":", results, false); + + // item:vnum:flag:socket0:socket1:socket2 + if (0 == results[0].compare("item")) + { + if (results.size() < 6) + return Py_BuildValue("s", ""); + + CItemData * pItemData = NULL; + + if (CItemManager::Instance().GetItemDataPointer(htoi(results[1].c_str()), &pItemData)) + { + char buf[1024] = { 0 }; + char itemlink[256]; + int len; + bool isAttr = false; + + len = snprintf(itemlink, sizeof(itemlink), "item:%x:%x:%x:%x:%x", + htoi(results[1].c_str()), + htoi(results[2].c_str()), + htoi(results[3].c_str()), + htoi(results[4].c_str()), + htoi(results[5].c_str())); + + if (results.size() >= 8) + { + for (int i = 6; i < results.size(); i += 2) + { + len += snprintf(itemlink + len, sizeof(itemlink) - len, ":%x:%I64d", + htoi(results[i].c_str()), + atoi(results[i+1].c_str())); + isAttr = true; + } + } + + if (isAttr) + //"item:번호:플래그:소켓0:소켓1:소켓2" + snprintf(buf, sizeof(buf), "|cffffc700|H%s|h[%s]|h|r", itemlink, pItemData->GetName()); + else + snprintf(buf, sizeof(buf), "|cfff1e6c0|H%s|h[%s]|h|r", itemlink, pItemData->GetName()); + + return Py_BuildValue("s", buf); + } + } + + return Py_BuildValue("s", ""); +} + +void initChat() +{ + static PyMethodDef s_methods[] = + { + { "SetChatColor", chatSetChatColor, METH_VARARGS }, + { "Clear", chatClear, METH_VARARGS }, + { "Close", chatClose, METH_VARARGS }, + + { "CreateChatSet", chatCreateChatSet, METH_VARARGS }, + { "Update", chatUpdate, METH_VARARGS }, + { "Render", chatRender, METH_VARARGS }, + + { "SetBoardState", chatSetBoardState, METH_VARARGS }, + { "SetPosition", chatSetPosition, METH_VARARGS }, + { "SetHeight", chatSetHeight, METH_VARARGS }, + { "SetStep", chatSetStep, METH_VARARGS }, + { "ToggleChatMode", chatToggleChatMode, METH_VARARGS }, + { "EnableChatMode", chatEnableChatMode, METH_VARARGS }, + { "DisableChatMode", chatDisableChatMode, METH_VARARGS }, + { "SetEndPos", chatSetEndPos, METH_VARARGS }, + + { "GetLineCount", chatGetLineCount, METH_VARARGS }, + { "GetVisibleLineCount", chatGetVisibleLineCount, METH_VARARGS }, + { "GetLineStep", chatGetLineStep, METH_VARARGS }, + + // Chat + { "AppendChat", chatAppendChat, METH_VARARGS }, + { "AppendChatWithDelay", chatAppendChatWithDelay, METH_VARARGS }, + { "ArrangeShowingChat", chatArrangeShowingChat, METH_VARARGS }, + + // Ignore + { "IgnoreCharacter", chatIgnoreCharacter, METH_VARARGS }, + { "IsIgnoreCharacter", chatIsIgnoreCharacter, METH_VARARGS }, + + // Whisper + { "CreateWhisper", chatCreateWhisper, METH_VARARGS }, + { "AppendWhisper", chatAppendWhisper, METH_VARARGS }, + { "RenderWhisper", chatRenderWhisper, METH_VARARGS }, + { "SetWhisperBoxSize", chatSetWhisperBoxSize, METH_VARARGS }, + { "SetWhisperPosition", chatSetWhisperPosition, METH_VARARGS }, + { "ClearWhisper", chatClearWhisper, METH_VARARGS }, + { "InitWhisper", chatInitWhisper, METH_VARARGS }, + + // Link + { "GetLinkFromHyperlink", chatGetLinkFromHyperlink, METH_VARARGS }, + + { NULL, NULL, NULL }, + }; + + PyObject * poModule = Py_InitModule("chat", s_methods); + + PyModule_AddIntConstant(poModule, "CHAT_TYPE_TALKING", CHAT_TYPE_TALKING); + PyModule_AddIntConstant(poModule, "CHAT_TYPE_INFO", CHAT_TYPE_INFO); + PyModule_AddIntConstant(poModule, "CHAT_TYPE_NOTICE", CHAT_TYPE_NOTICE); + PyModule_AddIntConstant(poModule, "CHAT_TYPE_PARTY", CHAT_TYPE_PARTY); + PyModule_AddIntConstant(poModule, "CHAT_TYPE_GUILD", CHAT_TYPE_GUILD); + PyModule_AddIntConstant(poModule, "CHAT_TYPE_COMMAND", CHAT_TYPE_COMMAND); + PyModule_AddIntConstant(poModule, "CHAT_TYPE_SHOUT", CHAT_TYPE_SHOUT); + PyModule_AddIntConstant(poModule, "CHAT_TYPE_WHISPER", CHAT_TYPE_WHISPER); + PyModule_AddIntConstant(poModule, "WHISPER_TYPE_CHAT", CPythonChat::WHISPER_TYPE_CHAT); + PyModule_AddIntConstant(poModule, "WHISPER_TYPE_SYSTEM", CPythonChat::WHISPER_TYPE_SYSTEM); + PyModule_AddIntConstant(poModule, "WHISPER_TYPE_GM", CPythonChat::WHISPER_TYPE_GM); + + PyModule_AddIntConstant(poModule, "BOARD_STATE_VIEW", CPythonChat::BOARD_STATE_VIEW); + PyModule_AddIntConstant(poModule, "BOARD_STATE_EDIT", CPythonChat::BOARD_STATE_EDIT); + PyModule_AddIntConstant(poModule, "BOARD_STATE_LOG", CPythonChat::BOARD_STATE_LOG); + + PyModule_AddIntConstant(poModule, "CHAT_SET_CHAT_WINDOW", 0); + PyModule_AddIntConstant(poModule, "CHAT_SET_LOG_WINDOW", 1); +} diff --git a/extension/src/port/UserInterface/PythonNetworkStreamCommand.cpp b/extension/src/port/UserInterface/PythonNetworkStreamCommand.cpp new file mode 100644 index 00000000..694e070e --- /dev/null +++ b/extension/src/port/UserInterface/PythonNetworkStreamCommand.cpp @@ -0,0 +1,557 @@ +#include "StdAfx.h" +#include "PythonNetworkStream.h" +#include "PythonNonPlayer.h" +#include "AbstractApplication.h" +#include "AbstractPlayer.h" +#include "AbstractCharacterManager.h" +#include "AbstractChat.h" +#include "InstanceBase.h" + +#define ishan(ch) (((ch) & 0xE0) > 0x90) +#define ishanasc(ch) (isascii(ch) || ishan(ch)) +#define ishanalp(ch) (isalpha(ch) || ishan(ch)) +#define isnhdigit(ch) (!ishan(ch) && isdigit(ch)) +#define isnhspace(ch) (!ishan(ch) && isspace(ch)) + +#define LOWER(c) (((c) >= 'A' && (c) <= 'Z') ? ((c) + ('a' - 'A')) : (c)) +#define UPPER(c) (((c) >= 'a' && (c) <= 'z') ? ((c) + ('A' - 'a')) : (c)) + +void SkipSpaces(char **string) +{ + for (; **string != '\0' && isnhspace((unsigned char) **string); ++(*string)); +} + +char *OneArgument(char *argument, char *first_arg) +{ + char mark = FALSE; + + if (!argument) + { + *first_arg = '\0'; + return NULL; + } + + SkipSpaces(&argument); + + while (*argument) + { + if (*argument == '\"') + { + mark = !mark; + ++argument; + continue; + } + + if (!mark && isnhspace((unsigned char) *argument)) + break; + + *(first_arg++) = LOWER(*argument); + ++argument; + } + + *first_arg = '\0'; + + SkipSpaces(&argument); + return (argument); +} + +void AppendMonsterList(const CPythonNonPlayer::TMobTableList & c_rMobTableList, const char * c_szHeader, int iType) +{ + DWORD dwMonsterCount = 0; + std::string strMonsterList = c_szHeader; + + CPythonNonPlayer::TMobTableList::const_iterator itor = c_rMobTableList.begin(); + for (; itor!=c_rMobTableList.end(); ++itor) + { + const CPythonNonPlayer::TMobTable * c_pMobTable = *itor; + if (iType == c_pMobTable->bRank) + { + if (dwMonsterCount != 0) + strMonsterList += ", "; + strMonsterList += c_pMobTable->szLocaleName; + if (++dwMonsterCount > 5) + break; + } + } + if (dwMonsterCount > 0) + { + IAbstractChat& rkChat=IAbstractChat::GetSingleton(); + rkChat.AppendChat(CHAT_TYPE_INFO, strMonsterList.c_str()); + } +} + +bool CPythonNetworkStream::ClientCommand(const char * c_szCommand) +{ + return false; +} + +bool SplitToken(const char * c_szLine, CTokenVector * pstTokenVector, const char * c_szDelimeter = " ") +{ + pstTokenVector->reserve(10); + pstTokenVector->clear(); + + std::string stToken; + std::string strLine = c_szLine; + + DWORD basePos = 0; + + do + { + int beginPos = strLine.find_first_not_of(c_szDelimeter, basePos); + if (beginPos < 0) + return false; + + int endPos; + + if (strLine[beginPos] == '"') + { + ++beginPos; + endPos = strLine.find_first_of("\"", beginPos); + + if (endPos < 0) + return false; + + basePos = endPos + 1; + } + else + { + endPos = strLine.find_first_of(c_szDelimeter, beginPos); + basePos = endPos; + } + + pstTokenVector->push_back(strLine.substr(beginPos, endPos - beginPos)); + + // 추가 코드. 맨뒤에 탭이 있는 경우를 체크한다. - [levites] + if (int(strLine.find_first_not_of(c_szDelimeter, basePos)) < 0) + break; + } while (basePos < strLine.length()); + + return true; +} + +void CPythonNetworkStream::ServerCommand(char * c_szCommand) +{ + // #0000811: [M2EU] 콘솔창 기능 차단 + if (strcmpi(c_szCommand, "ConsoleEnable") == 0) + return; + + if (m_apoPhaseWnd[PHASE_WINDOW_GAME]) + { + bool isTrue; + if (PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], + "BINARY_ServerCommand_Run", + Py_BuildValue("(s)", c_szCommand), + &isTrue + )) + { + if (isTrue) + return; + } + } + else if (m_poSerCommandParserWnd) + { + bool isTrue; + if (PyCallClassMemberFunc(m_poSerCommandParserWnd, + "BINARY_ServerCommand_Run", + Py_BuildValue("(s)", c_szCommand), + &isTrue + )) + { + if (isTrue) + return; + } + } + + CTokenVector TokenVector; + if (!SplitToken(c_szCommand, &TokenVector)) + return; + if (TokenVector.empty()) + return; + + const char * szCmd = TokenVector[0].c_str(); + + if (!strcmpi(szCmd, "quit")) + { + PostQuitMessage(0); + } + else if (!strcmpi(szCmd, "BettingMoney")) + { + if (2 != TokenVector.size()) + { + TraceError("CPythonNetworkStream::ServerCommand(c_szCommand=%s) - Strange Parameter Count : %s", c_szCommand); + return; + } + + //UINT uMoney= atoi(TokenVector[1].c_str()); + + } + // GIFT NOTIFY + else if (!strcmpi(szCmd, "gift")) + { + PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "Gift_Show", Py_BuildValue("()")); + } + // CUBE + else if (!strcmpi(szCmd, "cube")) + { + if (TokenVector.size() < 2) + { + TraceError("CPythonNetworkStream::ServerCommand(c_szCommand=%s) - Strange Parameter Count : %s", c_szCommand); + return; + } + + if ("open" == TokenVector[1]) + { + if (3 > TokenVector.size()) + { + TraceError("CPythonNetworkStream::ServerCommand(c_szCommand=%s) - Strange Parameter Count : %s", c_szCommand); + return; + } + + DWORD npcVNUM = (DWORD)atoi(TokenVector[2].c_str()); + PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "BINARY_Cube_Open", Py_BuildValue("(i)", npcVNUM)); + } + else if ("close" == TokenVector[1]) + { + PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "BINARY_Cube_Close", Py_BuildValue("()")); + } + else if ("info" == TokenVector[1]) + { + if (5 != TokenVector.size()) + { + TraceError("CPythonNetworkStream::ServerCommand(c_szCommand=%s) - Strange Parameter Count : %s", c_szCommand); + return; + } + + UINT gold = atoi(TokenVector[2].c_str()); + UINT itemVnum = atoi(TokenVector[3].c_str()); + UINT count = atoi(TokenVector[4].c_str()); + PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "BINARY_Cube_UpdateInfo", Py_BuildValue("(iii)", gold, itemVnum, count)); + } + else if ("success" == TokenVector[1]) + { + if (4 != TokenVector.size()) + { + TraceError("CPythonNetworkStream::ServerCommand(c_szCommand=%s) - Strange Parameter Count : %s", c_szCommand); + return; + } + + UINT itemVnum = atoi(TokenVector[2].c_str()); + UINT count = atoi(TokenVector[3].c_str()); + PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "BINARY_Cube_Succeed", Py_BuildValue("(ii)", itemVnum, count)); + } + else if ("fail" == TokenVector[1]) + { + PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "BINARY_Cube_Failed", Py_BuildValue("()")); + } + else if ("r_list" == TokenVector[1]) + { + // result list (/cube r_list npcVNUM resultCount resultText) + // 20383 4 72723,1/72725,1/72730.1/50001,5 <- 이런식으로 "/" 문자로 구분된 리스트를 줌 + if (5 != TokenVector.size()) + { + TraceError("CPythonNetworkStream::ServerCommand(c_szCommand=%s) - Strange Parameter Count : %d", c_szCommand, 5); + return; + } + + DWORD npcVNUM = (DWORD)atoi(TokenVector[2].c_str()); + + PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "BINARY_Cube_ResultList", Py_BuildValue("(is)", npcVNUM, TokenVector[4].c_str())); + } + else if ("m_info" == TokenVector[1]) + { + // material list (/cube m_info requestStartIndex resultCount MaterialText) + // ex) requestStartIndex: 0, resultCount : 5 - 해당 NPC가 만들수 있는 아이템 중 0~4번째에 해당하는 아이템을 만드는 데 필요한 모든 재료들이 MaterialText에 들어있음 + // 위 예시처럼 아이템이 다수인 경우 구분자 "@" 문자를 사용 + // 0 5 125,1|126,2|127,2|123,5&555,5&555,4/120000 <- 이런식으로 서버에서 클라로 리스트를 줌 + + if (5 != TokenVector.size()) + { + TraceError("CPythonNetworkStream::ServerCommand(c_szCommand=%s) - Strange Parameter Count : %d", c_szCommand, 5); + return; + } + + UINT requestStartIndex = (UINT)atoi(TokenVector[2].c_str()); + UINT resultCount = (UINT)atoi(TokenVector[3].c_str()); + + PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "BINARY_Cube_MaterialInfo", Py_BuildValue("(iis)", requestStartIndex, resultCount, TokenVector[4].c_str())); + } + } + // CUEBE_END + else if (!strcmpi(szCmd, "ObserverCount")) + { + if (2 != TokenVector.size()) + { + TraceError("CPythonNetworkStream::ServerCommand(c_szCommand=%s) - Strange Parameter Count : %s", c_szCommand); + return; + } + + UINT uObserverCount= atoi(TokenVector[1].c_str()); + + PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], + "BINARY_BettingGuildWar_UpdateObserverCount", + Py_BuildValue("(i)", uObserverCount) + ); + } + else if (!strcmpi(szCmd, "ObserverMode")) + { + if (2 != TokenVector.size()) + { + TraceError("CPythonNetworkStream::ServerCommand(c_szCommand=%s) - Strange Parameter Count : %s", c_szCommand); + return; + } + + UINT uMode= atoi(TokenVector[1].c_str()); + + IAbstractPlayer& rkPlayer=IAbstractPlayer::GetSingleton(); + rkPlayer.SetObserverMode(uMode ? true : false); + + PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], + "BINARY_BettingGuildWar_SetObserverMode", + Py_BuildValue("(i)", uMode) + ); + } + else if (!strcmpi(szCmd, "ObserverTeamInfo")) + { + } + else if (!strcmpi(szCmd, "StoneDetect")) + { + if (4 != TokenVector.size()) + { + TraceError("CPythonNetworkStream::ServerCommand(c_szCommand=%s) - Strange Parameter Count : %s", c_szCommand); + return; + } + + // vid distance(1-3) angle(0-360) + DWORD dwVID = atoi(TokenVector[1].c_str()); + BYTE byDistance = atoi(TokenVector[2].c_str()); + float fAngle = atof(TokenVector[3].c_str()); + fAngle = fmod(540.0f - fAngle, 360.0f); + Tracef("StoneDetect [VID:%d] [Distance:%d] [Angle:%d->%f]\n", dwVID, byDistance, atoi(TokenVector[3].c_str()), fAngle); + + IAbstractCharacterManager& rkChrMgr=IAbstractCharacterManager::GetSingleton(); + + CInstanceBase * pInstance = rkChrMgr.GetInstancePtr(dwVID); + if (!pInstance) + { + TraceError("CPythonNetworkStream::ServerCommand(c_szCommand=%s) - Not Exist Instance", c_szCommand); + return; + } + + TPixelPosition PixelPosition; + D3DXVECTOR3 v3Rotation(0.0f, 0.0f, fAngle); + pInstance->NEW_GetPixelPosition(&PixelPosition); + + PixelPosition.y *= -1.0f; + + switch (byDistance) + { + case 0: + CEffectManager::Instance().RegisterEffect("d:/ymir work/effect/etc/firecracker/find_out.mse"); + CEffectManager::Instance().CreateEffect("d:/ymir work/effect/etc/firecracker/find_out.mse", PixelPosition, v3Rotation); + break; + case 1: + CEffectManager::Instance().RegisterEffect("d:/ymir work/effect/etc/compass/appear_small.mse"); + CEffectManager::Instance().CreateEffect("d:/ymir work/effect/etc/compass/appear_small.mse", PixelPosition, v3Rotation); + break; + case 2: + CEffectManager::Instance().RegisterEffect("d:/ymir work/effect/etc/compass/appear_middle.mse"); + CEffectManager::Instance().CreateEffect("d:/ymir work/effect/etc/compass/appear_middle.mse", PixelPosition, v3Rotation); + break; + case 3: + CEffectManager::Instance().RegisterEffect("d:/ymir work/effect/etc/compass/appear_large.mse"); + CEffectManager::Instance().CreateEffect("d:/ymir work/effect/etc/compass/appear_large.mse", PixelPosition, v3Rotation); + break; + default: + TraceError("CPythonNetworkStream::ServerCommand(c_szCommand=%s) - Strange Distance", c_szCommand); + break; + } + +#ifdef _DEBUG + IAbstractChat& rkChat=IAbstractChat::GetSingleton(); + rkChat.AppendChat(CHAT_TYPE_INFO, c_szCommand); +#endif + } + else if (!strcmpi(szCmd, "StartStaminaConsume")) + { + if (3 != TokenVector.size()) + { + TraceError("CPythonNetworkStream::ServerCommand(c_szCommand=%s) - Strange Parameter Count : %s", c_szCommand); + return; + } + + DWORD dwConsumePerSec = atoi(TokenVector[1].c_str()); + DWORD dwCurrentStamina = atoi(TokenVector[2].c_str()); + + IAbstractPlayer& rPlayer=IAbstractPlayer::GetSingleton(); + rPlayer.StartStaminaConsume(dwConsumePerSec, dwCurrentStamina); + } + + else if (!strcmpi(szCmd, "StopStaminaConsume")) + { + if (2 != TokenVector.size()) + { + TraceError("CPythonNetworkStream::ServerCommand(c_szCommand=%s) - Strange Parameter Count : %d", c_szCommand, TokenVector.size()); + return; + } + + DWORD dwCurrentStamina = atoi(TokenVector[1].c_str()); + + IAbstractPlayer& rPlayer=IAbstractPlayer::GetSingleton(); + rPlayer.StopStaminaConsume(dwCurrentStamina); + } + else if (!strcmpi(szCmd, "sms")) + { + IAbstractPlayer& rPlayer=IAbstractPlayer::GetSingleton(); + rPlayer.SetMobileFlag(TRUE); + } + else if (!strcmpi(szCmd, "nosms")) + { + IAbstractPlayer& rPlayer=IAbstractPlayer::GetSingleton(); + rPlayer.SetMobileFlag(FALSE); + } + else if (!strcmpi(szCmd, "mobile_auth")) + { + PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "OnMobileAuthority", Py_BuildValue("()")); + } + else if (!strcmpi(szCmd, "messenger_auth")) + { + const std::string & c_rstrName = TokenVector[1].c_str(); + PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "OnMessengerAddFriendQuestion", Py_BuildValue("(s)", c_rstrName.c_str())); + } + else if (!strcmpi(szCmd, "combo")) + { + int iFlag = atoi(TokenVector[1].c_str()); + IAbstractPlayer& rPlayer=IAbstractPlayer::GetSingleton(); + rPlayer.SetComboSkillFlag(iFlag); + m_bComboSkillFlag = iFlag ? true : false; + } + else if (!strcmpi(szCmd, "setblockmode")) + { + int iFlag = atoi(TokenVector[1].c_str()); + PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "OnBlockMode", Py_BuildValue("(i)", iFlag)); + } + // Emotion Start + else if (!strcmpi(szCmd, "french_kiss")) + { + int iVID1 = atoi(TokenVector[1].c_str()); + int iVID2 = atoi(TokenVector[2].c_str()); + + IAbstractCharacterManager & rkChrMgr = IAbstractCharacterManager::GetSingleton(); + CInstanceBase * pInstance1 = rkChrMgr.GetInstancePtr(iVID1); + CInstanceBase * pInstance2 = rkChrMgr.GetInstancePtr(iVID2); + if (pInstance1 && pInstance2) + pInstance1->ActDualEmotion(*pInstance2, CRaceMotionData::NAME_FRENCH_KISS_START, CRaceMotionData::NAME_FRENCH_KISS_START); + } + else if (!strcmpi(szCmd, "kiss")) + { + int iVID1 = atoi(TokenVector[1].c_str()); + int iVID2 = atoi(TokenVector[2].c_str()); + + IAbstractCharacterManager & rkChrMgr = IAbstractCharacterManager::GetSingleton(); + CInstanceBase * pInstance1 = rkChrMgr.GetInstancePtr(iVID1); + CInstanceBase * pInstance2 = rkChrMgr.GetInstancePtr(iVID2); + if (pInstance1 && pInstance2) + pInstance1->ActDualEmotion(*pInstance2, CRaceMotionData::NAME_KISS_START, CRaceMotionData::NAME_KISS_START); + } + else if (!strcmpi(szCmd, "slap")) + { + int iVID1 = atoi(TokenVector[1].c_str()); + int iVID2 = atoi(TokenVector[2].c_str()); + + IAbstractCharacterManager & rkChrMgr = IAbstractCharacterManager::GetSingleton(); + CInstanceBase * pInstance1 = rkChrMgr.GetInstancePtr(iVID1); + CInstanceBase * pInstance2 = rkChrMgr.GetInstancePtr(iVID2); + if (pInstance1 && pInstance2) + pInstance1->ActDualEmotion(*pInstance2, CRaceMotionData::NAME_SLAP_HURT_START, CRaceMotionData::NAME_SLAP_HIT_START); + } + else if (!strcmpi(szCmd, "clap")) + { + int iVID = atoi(TokenVector[1].c_str()); + IAbstractCharacterManager & rkChrMgr = IAbstractCharacterManager::GetSingleton(); + CInstanceBase * pInstance = rkChrMgr.GetInstancePtr(iVID); + if (pInstance) + pInstance->ActEmotion(CRaceMotionData::NAME_CLAP); + } + else if (!strcmpi(szCmd, "cheer1")) + { + int iVID = atoi(TokenVector[1].c_str()); + IAbstractCharacterManager & rkChrMgr = IAbstractCharacterManager::GetSingleton(); + CInstanceBase * pInstance = rkChrMgr.GetInstancePtr(iVID); + if (pInstance) + pInstance->ActEmotion(CRaceMotionData::NAME_CHEERS_1); + } + else if (!strcmpi(szCmd, "cheer2")) + { + int iVID = atoi(TokenVector[1].c_str()); + IAbstractCharacterManager & rkChrMgr = IAbstractCharacterManager::GetSingleton(); + CInstanceBase * pInstance = rkChrMgr.GetInstancePtr(iVID); + if (pInstance) + pInstance->ActEmotion(CRaceMotionData::NAME_CHEERS_2); + } + else if (!strcmpi(szCmd, "dance1")) + { + int iVID = atoi(TokenVector[1].c_str()); + IAbstractCharacterManager & rkChrMgr = IAbstractCharacterManager::GetSingleton(); + CInstanceBase * pInstance = rkChrMgr.GetInstancePtr(iVID); + if (pInstance) + pInstance->ActEmotion(CRaceMotionData::NAME_DANCE_1); + } + else if (!strcmpi(szCmd, "dance2")) + { + int iVID = atoi(TokenVector[1].c_str()); + IAbstractCharacterManager & rkChrMgr = IAbstractCharacterManager::GetSingleton(); + CInstanceBase * pInstance = rkChrMgr.GetInstancePtr(iVID); + if (pInstance) + pInstance->ActEmotion(CRaceMotionData::NAME_DANCE_2); + } + else if (!strcmpi(szCmd, "dig_motion")) + { + int iVID = atoi(TokenVector[1].c_str()); + IAbstractCharacterManager & rkChrMgr = IAbstractCharacterManager::GetSingleton(); + CInstanceBase * pInstance = rkChrMgr.GetInstancePtr(iVID); + if (pInstance) + pInstance->ActEmotion(CRaceMotionData::NAME_DIG); + } + // Emotion End + else + { + static std::map s_emotionDict; + + static bool s_isFirst = true; + if (s_isFirst) + { + s_isFirst = false; + + s_emotionDict["dance3"] = CRaceMotionData::NAME_DANCE_3; + s_emotionDict["dance4"] = CRaceMotionData::NAME_DANCE_4; + s_emotionDict["dance5"] = CRaceMotionData::NAME_DANCE_5; + s_emotionDict["dance6"] = CRaceMotionData::NAME_DANCE_6; + s_emotionDict["congratulation"] = CRaceMotionData::NAME_CONGRATULATION; + s_emotionDict["forgive"] = CRaceMotionData::NAME_FORGIVE; + s_emotionDict["angry"] = CRaceMotionData::NAME_ANGRY; + s_emotionDict["attractive"] = CRaceMotionData::NAME_ATTRACTIVE; + s_emotionDict["sad"] = CRaceMotionData::NAME_SAD; + s_emotionDict["shy"] = CRaceMotionData::NAME_SHY; + s_emotionDict["cheerup"] = CRaceMotionData::NAME_CHEERUP; + s_emotionDict["banter"] = CRaceMotionData::NAME_BANTER; + s_emotionDict["joy"] = CRaceMotionData::NAME_JOY; + } + + std::map::iterator f = s_emotionDict.find(szCmd); + if (f == s_emotionDict.end()) + { + TraceError("Unknown Server Command %s | %s", c_szCommand, szCmd); + } + else + { + int emotionIndex = f->second; + + int iVID = atoi(TokenVector[1].c_str()); + IAbstractCharacterManager & rkChrMgr = IAbstractCharacterManager::GetSingleton(); + CInstanceBase * pInstance = rkChrMgr.GetInstancePtr(iVID); + + if (pInstance) + pInstance->ActEmotion(emotionIndex); + } + } +} diff --git a/extension/src/port/UserInterface/PythonNetworkStreamPhaseGame.cpp b/extension/src/port/UserInterface/PythonNetworkStreamPhaseGame.cpp new file mode 100644 index 00000000..437e52be --- /dev/null +++ b/extension/src/port/UserInterface/PythonNetworkStreamPhaseGame.cpp @@ -0,0 +1,4509 @@ +#include "StdAfx.h" +#include "PythonNetworkStream.h" +#include "Packet.h" + +#include "PythonGuild.h" +#include "PythonCharacterManager.h" +#include "PythonPlayer.h" +#include "PythonBackground.h" +#include "PythonMiniMap.h" +#include "PythonTextTail.h" +#include "PythonItem.h" +#include "PythonChat.h" +#include "PythonShop.h" +#include "PythonExchange.h" +#include "PythonQuest.h" +#include "PythonEventManager.h" +#include "PythonMessenger.h" +#include "PythonApplication.h" + +#include "../EterPack/EterPackManager.h" +#include "../GameLib/ItemManager.h" + +#include "AbstractApplication.h" +#include "AbstractCharacterManager.h" +#include "InstanceBase.h" + +#include "ProcessCRC.h" + +BOOL gs_bEmpireLanuageEnable = TRUE; + +void CPythonNetworkStream::__RefreshAlignmentWindow() +{ + PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "RefreshAlignment", Py_BuildValue("()")); +} + +void CPythonNetworkStream::__RefreshTargetBoardByVID(DWORD dwVID) +{ + PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "RefreshTargetBoardByVID", Py_BuildValue("(i)", dwVID)); +} + +void CPythonNetworkStream::__RefreshTargetBoardByName(const char * c_szName) +{ + PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "RefreshTargetBoardByName", Py_BuildValue("(s)", c_szName)); +} + +void CPythonNetworkStream::__RefreshTargetBoard() +{ + PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "RefreshTargetBoard", Py_BuildValue("()")); +} + +void CPythonNetworkStream::__RefreshGuildWindowGradePage() +{ + m_isRefreshGuildWndGradePage=true; +} + +void CPythonNetworkStream::__RefreshGuildWindowSkillPage() +{ + m_isRefreshGuildWndSkillPage=true; +} + +void CPythonNetworkStream::__RefreshGuildWindowMemberPageGradeComboBox() +{ + m_isRefreshGuildWndMemberPageGradeComboBox=true; +} + +void CPythonNetworkStream::__RefreshGuildWindowMemberPage() +{ + m_isRefreshGuildWndMemberPage=true; +} + +void CPythonNetworkStream::__RefreshGuildWindowBoardPage() +{ + m_isRefreshGuildWndBoardPage=true; +} + +void CPythonNetworkStream::__RefreshGuildWindowInfoPage() +{ + m_isRefreshGuildWndInfoPage=true; +} + +void CPythonNetworkStream::__RefreshMessengerWindow() +{ + m_isRefreshMessengerWnd=true; +} + +void CPythonNetworkStream::__RefreshSafeboxWindow() +{ + m_isRefreshSafeboxWnd=true; +} + +void CPythonNetworkStream::__RefreshMallWindow() +{ + m_isRefreshMallWnd=true; +} + +void CPythonNetworkStream::__RefreshSkillWindow() +{ + m_isRefreshSkillWnd=true; +} + +void CPythonNetworkStream::__RefreshExchangeWindow() +{ + m_isRefreshExchangeWnd=true; +} + +void CPythonNetworkStream::__RefreshStatus() +{ + m_isRefreshStatus=true; +} + +void CPythonNetworkStream::__RefreshCharacterWindow() +{ + m_isRefreshCharacterWnd=true; +} + +void CPythonNetworkStream::__RefreshInventoryWindow() +{ + m_isRefreshInventoryWnd=true; +} + +void CPythonNetworkStream::__RefreshEquipmentWindow() +{ + m_isRefreshEquipmentWnd=true; +} + +void CPythonNetworkStream::__SetGuildID(DWORD id) +{ + if (m_dwGuildID != id) + { + m_dwGuildID = id; + IAbstractPlayer& rkPlayer = IAbstractPlayer::GetSingleton(); + + for (int i = 0; i < PLAYER_PER_ACCOUNT4; ++i) + if (!strncmp(m_akSimplePlayerInfo[i].szName, rkPlayer.GetName(), CHARACTER_NAME_MAX_LEN)) + { + m_adwGuildID[i] = id; + + std::string guildName; + if (CPythonGuild::Instance().GetGuildName(id, &guildName)) + { + m_astrGuildName[i] = guildName; + } + else + { + m_astrGuildName[i] = ""; + } + } + } +} + +struct PERF_PacketInfo +{ + DWORD dwCount; + DWORD dwTime; + + PERF_PacketInfo() + { + dwCount=0; + dwTime=0; + } +}; + + +#ifdef __PERFORMANCE_CHECK__ + +class PERF_PacketTimeAnalyzer +{ + public: + ~PERF_PacketTimeAnalyzer() + { + FILE* fp=fopen("perf_dispatch_packet_result.txt", "w"); + + for (std::map::iterator i=m_kMap_kPacketInfo.begin(); i!=m_kMap_kPacketInfo.end(); ++i) + { + if (i->second.dwTime>0) + fprintf(fp, "header %d: count %d, time %d, tpc %d\n", i->first, i->second.dwCount, i->second.dwTime, i->second.dwTime/i->second.dwCount); + } + fclose(fp); + } + + public: + std::map m_kMap_kPacketInfo; +}; + +PERF_PacketTimeAnalyzer gs_kPacketTimeAnalyzer; + +#endif + +// Game Phase --------------------------------------------------------------------------- +void CPythonNetworkStream::GamePhase() +{ + if (!m_kQue_stHack.empty()) + { + __SendHack(m_kQue_stHack.front().c_str()); + m_kQue_stHack.pop_front(); + } + + TPacketHeader header = 0; + bool ret = true; + +#ifdef __PERFORMANCE_CHECK__ + DWORD timeBeginDispatch=timeGetTime(); + + static std::map kMap_kPacketInfo; + kMap_kPacketInfo.clear(); +#endif + + const DWORD MAX_RECV_COUNT = 4; + const DWORD SAFE_RECV_BUFSIZE = 8192; + DWORD dwRecvCount = 0; + + while (ret) + { + if(dwRecvCount++ >= MAX_RECV_COUNT-1 && GetRecvBufferSize() < SAFE_RECV_BUFSIZE + && m_strPhase == "Game") //phase_game 이 아니어도 여기로 들어오는 경우가 있다. + break; + + if (!CheckPacket(&header)) + break; + +#ifdef __PERFORMANCE_CHECK__ + DWORD timeBeginPacket=timeGetTime(); +#endif + + switch (header) + { + case HEADER_GC_OBSERVER_ADD: + ret = RecvObserverAddPacket(); + break; + case HEADER_GC_OBSERVER_REMOVE: + ret = RecvObserverRemovePacket(); + break; + case HEADER_GC_OBSERVER_MOVE: + ret = RecvObserverMovePacket(); + break; + case HEADER_GC_WARP: + ret = RecvWarpPacket(); + break; + + case HEADER_GC_PHASE: + ret = RecvPhasePacket(); + return; // 도중에 Phase 가 바뀌면 일단 무조건 GamePhase 탈출 - [levites] + break; + + case HEADER_GC_PVP: + ret = RecvPVPPacket(); + break; + + case HEADER_GC_DUEL_START: + ret = RecvDuelStartPacket(); + break; + + case HEADER_GC_CHARACTER_ADD: + ret = RecvCharacterAppendPacket(); + break; + + case HEADER_GC_CHAR_ADDITIONAL_INFO: + ret = RecvCharacterAdditionalInfo(); + break; + + case HEADER_GC_CHARACTER_ADD2: + ret = RecvCharacterAppendPacketNew(); + break; + + case HEADER_GC_CHARACTER_UPDATE: + ret = RecvCharacterUpdatePacket(); + break; + + case HEADER_GC_CHARACTER_UPDATE2: + ret = RecvCharacterUpdatePacketNew(); + break; + + case HEADER_GC_CHARACTER_DEL: + ret = RecvCharacterDeletePacket(); + break; + + case HEADER_GC_CHAT: + ret = RecvChatPacket(); + break; + + case HEADER_GC_SYNC_POSITION: + ret = RecvSyncPositionPacket(); + break; + + case HEADER_GC_OWNERSHIP: + ret = RecvOwnerShipPacket(); + break; + + case HEADER_GC_WHISPER: + ret = RecvWhisperPacket(); + break; + + case HEADER_GC_CHARACTER_MOVE: + ret = RecvCharacterMovePacket(); + break; + + // Position + case HEADER_GC_CHARACTER_POSITION: + ret = RecvCharacterPositionPacket(); + break; + + // Battle Packet + case HEADER_GC_STUN: + ret = RecvStunPacket(); + break; + + case HEADER_GC_DEAD: + ret = RecvDeadPacket(); + break; + + case HEADER_GC_PLAYER_POINT_CHANGE: + ret = RecvPointChange(); + break; + + // item packet. + case HEADER_GC_ITEM_SET: + ret = RecvItemSetPacket(); + break; + + case HEADER_GC_ITEM_SET2: + ret = RecvItemSetPacket2(); + break; + + case HEADER_GC_ITEM_USE: + ret = RecvItemUsePacket(); + break; + + case HEADER_GC_ITEM_UPDATE: + ret = RecvItemUpdatePacket(); + break; + + case HEADER_GC_ITEM_GROUND_ADD: + ret = RecvItemGroundAddPacket(); + break; + + case HEADER_GC_ITEM_GROUND_DEL: + ret = RecvItemGroundDelPacket(); + break; + + case HEADER_GC_ITEM_OWNERSHIP: + ret = RecvItemOwnership(); + break; + + case HEADER_GC_QUICKSLOT_ADD: + ret = RecvQuickSlotAddPacket(); + break; + + case HEADER_GC_QUICKSLOT_DEL: + ret = RecvQuickSlotDelPacket(); + break; + + case HEADER_GC_QUICKSLOT_SWAP: + ret = RecvQuickSlotMovePacket(); + break; + + case HEADER_GC_MOTION: + ret = RecvMotionPacket(); + break; + + case HEADER_GC_SHOP: + ret = RecvShopPacket(); + break; + + case HEADER_GC_SHOP_SIGN: + ret = RecvShopSignPacket(); + break; + + case HEADER_GC_EXCHANGE: + ret = RecvExchangePacket(); + break; + + case HEADER_GC_QUEST_INFO: + ret = RecvQuestInfoPacket(); + break; + + case HEADER_GC_REQUEST_MAKE_GUILD: + ret = RecvRequestMakeGuild(); + break; + + case HEADER_GC_PING: + ret = RecvPingPacket(); + break; + + case HEADER_GC_SCRIPT: + ret = RecvScriptPacket(); + break; + + case HEADER_GC_QUEST_CONFIRM: + ret = RecvQuestConfirmPacket(); + break; + + case HEADER_GC_TARGET: + ret = RecvTargetPacket(); + break; + + case HEADER_GC_DAMAGE_INFO: + ret = RecvDamageInfoPacket(); + break; + + case HEADER_GC_MOUNT: + ret = RecvMountPacket(); + break; + + case HEADER_GC_CHANGE_SPEED: + ret = RecvChangeSpeedPacket(); + break; + + case HEADER_GC_PLAYER_POINTS: + ret = __RecvPlayerPoints(); + break; + + case HEADER_GC_CREATE_FLY: + ret = RecvCreateFlyPacket(); + break; + + case HEADER_GC_FLY_TARGETING: + ret = RecvFlyTargetingPacket(); + break; + + case HEADER_GC_ADD_FLY_TARGETING: + ret = RecvAddFlyTargetingPacket(); + break; + + case HEADER_GC_SKILL_LEVEL: + ret = RecvSkillLevel(); + break; + + case HEADER_GC_SKILL_LEVEL_NEW: + ret = RecvSkillLevelNew(); + break; + + case HEADER_GC_MESSENGER: + ret = RecvMessenger(); + break; + + case HEADER_GC_GUILD: + ret = RecvGuild(); + break; + + case HEADER_GC_PARTY_INVITE: + ret = RecvPartyInvite(); + break; + + case HEADER_GC_PARTY_ADD: + ret = RecvPartyAdd(); + break; + + case HEADER_GC_PARTY_UPDATE: + ret = RecvPartyUpdate(); + break; + + case HEADER_GC_PARTY_REMOVE: + ret = RecvPartyRemove(); + break; + + case HEADER_GC_PARTY_LINK: + ret = RecvPartyLink(); + break; + + case HEADER_GC_PARTY_UNLINK: + ret = RecvPartyUnlink(); + break; + + case HEADER_GC_PARTY_PARAMETER: + ret = RecvPartyParameter(); + break; + + case HEADER_GC_SAFEBOX_SET: + ret = RecvSafeBoxSetPacket(); + break; + + case HEADER_GC_SAFEBOX_DEL: + ret = RecvSafeBoxDelPacket(); + break; + + case HEADER_GC_SAFEBOX_WRONG_PASSWORD: + ret = RecvSafeBoxWrongPasswordPacket(); + break; + + case HEADER_GC_SAFEBOX_SIZE: + ret = RecvSafeBoxSizePacket(); + break; + + case HEADER_GC_SAFEBOX_MONEY_CHANGE: + ret = RecvSafeBoxMoneyChangePacket(); + break; + + case HEADER_GC_FISHING: + ret = RecvFishing(); + break; + + case HEADER_GC_DUNGEON: + ret = RecvDungeon(); + break; + + case HEADER_GC_TIME: + ret = RecvTimePacket(); + break; + + case HEADER_GC_WALK_MODE: + ret = RecvWalkModePacket(); + break; + + case HEADER_GC_CHANGE_SKILL_GROUP: + ret = RecvChangeSkillGroupPacket(); + break; + + case HEADER_GC_REFINE_INFORMATION: + ret = RecvRefineInformationPacket(); + break; + + case HEADER_GC_REFINE_INFORMATION_NEW: + ret = RecvRefineInformationPacketNew(); + break; + + case HEADER_GC_SEPCIAL_EFFECT: + ret = RecvSpecialEffect(); + break; + + case HEADER_GC_NPC_POSITION: + ret = RecvNPCList(); + break; + + case HEADER_GC_CHANNEL: + ret = RecvChannelPacket(); + break; + + case HEADER_GC_VIEW_EQUIP: + ret = RecvViewEquipPacket(); + break; + + case HEADER_GC_LAND_LIST: + ret = RecvLandPacket(); + break; + + //case HEADER_GC_TARGET_CREATE: + // ret = RecvTargetCreatePacket(); + // break; + + case HEADER_GC_TARGET_CREATE_NEW: + ret = RecvTargetCreatePacketNew(); + break; + + case HEADER_GC_TARGET_UPDATE: + ret = RecvTargetUpdatePacket(); + break; + + case HEADER_GC_TARGET_DELETE: + ret = RecvTargetDeletePacket(); + break; + + case HEADER_GC_AFFECT_ADD: + ret = RecvAffectAddPacket(); + break; + + case HEADER_GC_AFFECT_REMOVE: + ret = RecvAffectRemovePacket(); + break; + + case HEADER_GC_MALL_OPEN: + ret = RecvMallOpenPacket(); + break; + + case HEADER_GC_MALL_SET: + ret = RecvMallItemSetPacket(); + break; + + case HEADER_GC_MALL_DEL: + ret = RecvMallItemDelPacket(); + break; + + case HEADER_GC_LOVER_INFO: + ret = RecvLoverInfoPacket(); + break; + + case HEADER_GC_LOVE_POINT_UPDATE: + ret = RecvLovePointUpdatePacket(); + break; + + case HEADER_GC_DIG_MOTION: + ret = RecvDigMotionPacket(); + break; + + case HEADER_GC_HANDSHAKE: + RecvHandshakePacket(); + return; + break; + + case HEADER_GC_HANDSHAKE_OK: + RecvHandshakeOKPacket(); + return; + break; + + case HEADER_GC_HYBRIDCRYPT_KEYS: + RecvHybridCryptKeyPacket(); + return; + break; + + case HEADER_GC_HYBRIDCRYPT_SDB: + RecvHybridCryptSDBPacket(); + return; + break; + + +#ifdef _IMPROVED_PACKET_ENCRYPTION_ + case HEADER_GC_KEY_AGREEMENT: + RecvKeyAgreementPacket(); + return; + break; + + case HEADER_GC_KEY_AGREEMENT_COMPLETED: + RecvKeyAgreementCompletedPacket(); + return; + break; +#endif + + case HEADER_GC_HS_REQUEST: + ret = RecvHSCheckRequest(); + break; + + case HEADER_GC_XTRAP_CS1_REQUEST: + ret = RecvXTrapVerifyRequest(); + break; + + case HEADER_GC_SPECIFIC_EFFECT: + ret = RecvSpecificEffect(); + break; + + case HEADER_GC_DRAGON_SOUL_REFINE: + ret = RecvDragonSoulRefine(); + break; + + default: + ret = RecvDefaultPacket(header); + break; + } +#ifdef __PERFORMANCE_CHECK__ + DWORD timeEndPacket=timeGetTime(); + + { + PERF_PacketInfo& rkPacketInfo=kMap_kPacketInfo[header]; + rkPacketInfo.dwCount++; + rkPacketInfo.dwTime+=timeEndPacket-timeBeginPacket; + } + + { + PERF_PacketInfo& rkPacketInfo=gs_kPacketTimeAnalyzer.m_kMap_kPacketInfo[header]; + rkPacketInfo.dwCount++; + rkPacketInfo.dwTime+=timeEndPacket-timeBeginPacket; + } +#endif + } + +#ifdef __PERFORMANCE_CHECK__ + DWORD timeEndDispatch=timeGetTime(); + + if (timeEndDispatch-timeBeginDispatch>2) + { + static FILE* fp=fopen("perf_dispatch_packet.txt", "w"); + + fprintf(fp, "delay %d\n", timeEndDispatch-timeBeginDispatch); + for (std::map::iterator i=kMap_kPacketInfo.begin(); i!=kMap_kPacketInfo.end(); ++i) + { + if (i->second.dwTime>0) + fprintf(fp, "header %d: count %d, time %d\n", i->first, i->second.dwCount, i->second.dwTime); + } + fputs("=====================================================\n", fp); + fflush(fp); + } +#endif + + if (!ret) + RecvErrorPacket(header); + + static DWORD s_nextRefreshTime = ELTimer_GetMSec(); + + DWORD curTime = ELTimer_GetMSec(); + if (s_nextRefreshTime > curTime) + return; + + + + if (m_isRefreshCharacterWnd) + { + m_isRefreshCharacterWnd=false; + PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "RefreshCharacter", Py_BuildValue("()")); + s_nextRefreshTime = curTime + 300; + } + + if (m_isRefreshEquipmentWnd) + { + m_isRefreshEquipmentWnd=false; + PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "RefreshEquipment", Py_BuildValue("()")); + s_nextRefreshTime = curTime + 300; + } + + if (m_isRefreshInventoryWnd) + { + m_isRefreshInventoryWnd=false; + PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "RefreshInventory", Py_BuildValue("()")); + s_nextRefreshTime = curTime + 300; + } + + if (m_isRefreshExchangeWnd) + { + m_isRefreshExchangeWnd=false; + PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "RefreshExchange", Py_BuildValue("()")); + s_nextRefreshTime = curTime + 300; + } + + if (m_isRefreshSkillWnd) + { + m_isRefreshSkillWnd=false; + PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "RefreshSkill", Py_BuildValue("()")); + s_nextRefreshTime = curTime + 300; + } + + if (m_isRefreshSafeboxWnd) + { + m_isRefreshSafeboxWnd=false; + PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "RefreshSafebox", Py_BuildValue("()")); + s_nextRefreshTime = curTime + 300; + } + + if (m_isRefreshMallWnd) + { + m_isRefreshMallWnd=false; + PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "RefreshMall", Py_BuildValue("()")); + s_nextRefreshTime = curTime + 300; + } + + if (m_isRefreshStatus) + { + m_isRefreshStatus=false; + PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "RefreshStatus", Py_BuildValue("()")); + s_nextRefreshTime = curTime + 300; + } + + if (m_isRefreshMessengerWnd) + { + m_isRefreshMessengerWnd=false; + PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "RefreshMessenger", Py_BuildValue("()")); + s_nextRefreshTime = curTime + 300; + } + + if (m_isRefreshGuildWndInfoPage) + { + m_isRefreshGuildWndInfoPage=false; + PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "RefreshGuildInfoPage", Py_BuildValue("()")); + s_nextRefreshTime = curTime + 300; + } + + if (m_isRefreshGuildWndBoardPage) + { + m_isRefreshGuildWndBoardPage=false; + PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "RefreshGuildBoardPage", Py_BuildValue("()")); + s_nextRefreshTime = curTime + 300; + } + + if (m_isRefreshGuildWndMemberPage) + { + m_isRefreshGuildWndMemberPage=false; + PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "RefreshGuildMemberPage", Py_BuildValue("()")); + s_nextRefreshTime = curTime + 300; + } + + if (m_isRefreshGuildWndMemberPageGradeComboBox) + { + m_isRefreshGuildWndMemberPageGradeComboBox=false; + PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "RefreshGuildMemberPageGradeComboBox", Py_BuildValue("()")); + s_nextRefreshTime = curTime + 300; + } + + if (m_isRefreshGuildWndSkillPage) + { + m_isRefreshGuildWndSkillPage=false; + PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "RefreshGuildSkillPage", Py_BuildValue("()")); + s_nextRefreshTime = curTime + 300; + } + + if (m_isRefreshGuildWndGradePage) + { + m_isRefreshGuildWndGradePage=false; + PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "RefreshGuildGradePage", Py_BuildValue("()")); + s_nextRefreshTime = curTime + 300; + } +} + +void CPythonNetworkStream::__InitializeGamePhase() +{ + __ServerTimeSync_Initialize(); + + m_isRefreshStatus=false; + m_isRefreshCharacterWnd=false; + m_isRefreshEquipmentWnd=false; + m_isRefreshInventoryWnd=false; + m_isRefreshExchangeWnd=false; + m_isRefreshSkillWnd=false; + m_isRefreshSafeboxWnd=false; + m_isRefreshMallWnd=false; + m_isRefreshMessengerWnd=false; + m_isRefreshGuildWndInfoPage=false; + m_isRefreshGuildWndBoardPage=false; + m_isRefreshGuildWndMemberPage=false; + m_isRefreshGuildWndMemberPageGradeComboBox=false; + m_isRefreshGuildWndSkillPage=false; + m_isRefreshGuildWndGradePage=false; + + m_EmoticonStringVector.clear(); + + m_pInstTarget = NULL; +} + +void CPythonNetworkStream::Warp(LONG lGlobalX, LONG lGlobalY) +{ + CPythonBackground& rkBgMgr=CPythonBackground::Instance(); + rkBgMgr.Destroy(); + rkBgMgr.Create(); + rkBgMgr.Warp(lGlobalX, lGlobalY); + //rkBgMgr.SetShadowLevel(CPythonBackground::SHADOW_ALL); + rkBgMgr.RefreshShadowLevel(); + + // NOTE : Warp 했을때 CenterPosition의 Height가 0이기 때문에 카메라가 땅바닥에 박혀있게 됨 + // 움직일때마다 Height가 갱신 되기 때문이므로 맵을 이동하면 Position을 강제로 한번 + // 셋팅해준다 - [levites] + LONG lLocalX = lGlobalX; + LONG lLocalY = lGlobalY; + __GlobalPositionToLocalPosition(lLocalX, lLocalY); + float fHeight = CPythonBackground::Instance().GetHeight(float(lLocalX), float(lLocalY)); + + IAbstractApplication& rkApp=IAbstractApplication::GetSingleton(); + rkApp.SetCenterPosition(float(lLocalX), float(lLocalY), fHeight); + + __ShowMapName(lLocalX, lLocalY); +} + +void CPythonNetworkStream::__ShowMapName(LONG lLocalX, LONG lLocalY) +{ + const std::string & c_rstrMapFileName = CPythonBackground::Instance().GetWarpMapName(); + PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "ShowMapName", Py_BuildValue("(sii)", c_rstrMapFileName.c_str(), lLocalX, lLocalY)); +} + +void CPythonNetworkStream::__LeaveGamePhase() +{ + CInstanceBase::ClearPVPKeySystem(); + + __ClearNetworkActorManager(); + + m_bComboSkillFlag = FALSE; + + IAbstractCharacterManager& rkChrMgr=IAbstractCharacterManager::GetSingleton(); + rkChrMgr.Destroy(); + + CPythonItem& rkItemMgr=CPythonItem::Instance(); + rkItemMgr.Destroy(); +} + +void CPythonNetworkStream::SetGamePhase() +{ + if ("Game"!=m_strPhase) + m_phaseLeaveFunc.Run(); + + Tracen(""); + Tracen("## Network - Game Phase ##"); + Tracen(""); + + m_strPhase = "Game"; + + m_dwChangingPhaseTime = ELTimer_GetMSec(); + m_phaseProcessFunc.Set(this, &CPythonNetworkStream::GamePhase); + m_phaseLeaveFunc.Set(this, &CPythonNetworkStream::__LeaveGamePhase); + + // Main Character 등록O + + IAbstractPlayer & rkPlayer = IAbstractPlayer::GetSingleton(); + rkPlayer.SetMainCharacterIndex(GetMainActorVID()); + + __RefreshStatus(); +} + +bool CPythonNetworkStream::RecvObserverAddPacket() +{ + TPacketGCObserverAdd kObserverAddPacket; + if (!Recv(sizeof(kObserverAddPacket), &kObserverAddPacket)) + return false; + + CPythonMiniMap::Instance().AddObserver( + kObserverAddPacket.vid, + kObserverAddPacket.x*100.0f, + kObserverAddPacket.y*100.0f); + + return true; +} + +bool CPythonNetworkStream::RecvObserverRemovePacket() +{ + TPacketGCObserverAdd kObserverRemovePacket; + if (!Recv(sizeof(kObserverRemovePacket), &kObserverRemovePacket)) + return false; + + CPythonMiniMap::Instance().RemoveObserver( + kObserverRemovePacket.vid + ); + + return true; +} + +bool CPythonNetworkStream::RecvObserverMovePacket() +{ + TPacketGCObserverMove kObserverMovePacket; + if (!Recv(sizeof(kObserverMovePacket), &kObserverMovePacket)) + return false; + + CPythonMiniMap::Instance().MoveObserver( + kObserverMovePacket.vid, + kObserverMovePacket.x*100.0f, + kObserverMovePacket.y*100.0f); + + return true; +} + + +bool CPythonNetworkStream::RecvWarpPacket() +{ + TPacketGCWarp kWarpPacket; + + if (!Recv(sizeof(kWarpPacket), &kWarpPacket)) + return false; + + __DirectEnterMode_Set(m_dwSelectedCharacterIndex); + + CNetworkStream::Connect((DWORD)kWarpPacket.lAddr, kWarpPacket.wPort); + + return true; +} + +bool CPythonNetworkStream::RecvDuelStartPacket() +{ + TPacketGCDuelStart kDuelStartPacket; + if (!Recv(sizeof(kDuelStartPacket), &kDuelStartPacket)) + return false; + + DWORD count = (kDuelStartPacket.wSize - sizeof(kDuelStartPacket))/sizeof(DWORD); + + CPythonCharacterManager & rkChrMgr = CPythonCharacterManager::Instance(); + + CInstanceBase* pkInstMain=rkChrMgr.GetMainInstancePtr(); + if (!pkInstMain) + { + TraceError("CPythonNetworkStream::RecvDuelStartPacket - MainCharacter is NULL"); + return false; + } + DWORD dwVIDSrc = pkInstMain->GetVirtualID(); + DWORD dwVIDDest; + + for ( DWORD i = 0; i < count; i++) + { + Recv(sizeof(dwVIDDest),&dwVIDDest); + CInstanceBase::InsertDUELKey(dwVIDSrc,dwVIDDest); + } + + if(count == 0) + pkInstMain->SetDuelMode(CInstanceBase::DUEL_CANNOTATTACK); + else + pkInstMain->SetDuelMode(CInstanceBase::DUEL_START); + + PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "CloseTargetBoard", Py_BuildValue("()")); + + rkChrMgr.RefreshAllPCTextTail(); + + return true; +} + +bool CPythonNetworkStream::RecvPVPPacket() +{ + TPacketGCPVP kPVPPacket; + if (!Recv(sizeof(kPVPPacket), &kPVPPacket)) + return false; + + CPythonCharacterManager & rkChrMgr = CPythonCharacterManager::Instance(); + CPythonPlayer & rkPlayer = CPythonPlayer::Instance(); + + switch (kPVPPacket.bMode) + { + case PVP_MODE_AGREE: + rkChrMgr.RemovePVPKey(kPVPPacket.dwVIDSrc, kPVPPacket.dwVIDDst); + + // 상대가 나(Dst)에게 동의를 구했을때 + if (rkPlayer.IsMainCharacterIndex(kPVPPacket.dwVIDDst)) + rkPlayer.RememberChallengeInstance(kPVPPacket.dwVIDSrc); + + // 상대에게 동의를 구한 동안에는 대결 불능 + if (rkPlayer.IsMainCharacterIndex(kPVPPacket.dwVIDSrc)) + rkPlayer.RememberCantFightInstance(kPVPPacket.dwVIDDst); + break; + case PVP_MODE_REVENGE: + { + rkChrMgr.RemovePVPKey(kPVPPacket.dwVIDSrc, kPVPPacket.dwVIDDst); + + DWORD dwKiller = kPVPPacket.dwVIDSrc; + DWORD dwVictim = kPVPPacket.dwVIDDst; + + // 내(victim)가 상대에게 복수할 수 있을때 + if (rkPlayer.IsMainCharacterIndex(dwVictim)) + rkPlayer.RememberRevengeInstance(dwKiller); + + // 상대(victim)가 나에게 복수하는 동안에는 대결 불능 + if (rkPlayer.IsMainCharacterIndex(dwKiller)) + rkPlayer.RememberCantFightInstance(dwVictim); + break; + } + + case PVP_MODE_FIGHT: + rkChrMgr.InsertPVPKey(kPVPPacket.dwVIDSrc, kPVPPacket.dwVIDDst); + rkPlayer.ForgetInstance(kPVPPacket.dwVIDSrc); + rkPlayer.ForgetInstance(kPVPPacket.dwVIDDst); + break; + case PVP_MODE_NONE: + rkChrMgr.RemovePVPKey(kPVPPacket.dwVIDSrc, kPVPPacket.dwVIDDst); + rkPlayer.ForgetInstance(kPVPPacket.dwVIDSrc); + rkPlayer.ForgetInstance(kPVPPacket.dwVIDDst); + break; + } + + // NOTE : PVP 토글시 TargetBoard 를 업데이트 합니다. + __RefreshTargetBoardByVID(kPVPPacket.dwVIDSrc); + __RefreshTargetBoardByVID(kPVPPacket.dwVIDDst); + + return true; +} + +// DELETEME +/* +void CPythonNetworkStream::__SendWarpPacket() +{ + TPacketCGWarp kWarpPacket; + kWarpPacket.bHeader=HEADER_GC_WARP; + if (!Send(sizeof(kWarpPacket), &kWarpPacket)) + { + return; + } +} +*/ +void CPythonNetworkStream::NotifyHack(const char* c_szMsg) +{ + if (!m_kQue_stHack.empty()) + if (c_szMsg==m_kQue_stHack.back()) + return; + + m_kQue_stHack.push_back(c_szMsg); +} + +bool CPythonNetworkStream::__SendHack(const char* c_szMsg) +{ + Tracen(c_szMsg); + + TPacketCGHack kPacketHack; + kPacketHack.bHeader=HEADER_CG_HACK; + strncpy(kPacketHack.szBuf, c_szMsg, sizeof(kPacketHack.szBuf)-1); + + if (!Send(sizeof(kPacketHack), &kPacketHack)) + return false; + + return SendSequence(); +} + +bool CPythonNetworkStream::SendMessengerAddByVIDPacket(DWORD vid) +{ + TPacketCGMessenger packet; + packet.header = HEADER_CG_MESSENGER; + packet.subheader = MESSENGER_SUBHEADER_CG_ADD_BY_VID; + if (!Send(sizeof(packet), &packet)) + return false; + if (!Send(sizeof(vid), &vid)) + return false; + return SendSequence(); +} + +bool CPythonNetworkStream::SendMessengerAddByNamePacket(const char * c_szName) +{ + TPacketCGMessenger packet; + packet.header = HEADER_CG_MESSENGER; + packet.subheader = MESSENGER_SUBHEADER_CG_ADD_BY_NAME; + if (!Send(sizeof(packet), &packet)) + return false; + char szName[CHARACTER_NAME_MAX_LEN]; + strncpy(szName, c_szName, CHARACTER_NAME_MAX_LEN-1); + szName[CHARACTER_NAME_MAX_LEN-1] = '\0'; // #720: 메신저 이름 관련 버퍼 오버플로우 버그 수정 + + if (!Send(sizeof(szName), &szName)) + return false; + Tracef(" SendMessengerAddByNamePacket : %s\n", c_szName); + return SendSequence(); +} + +bool CPythonNetworkStream::SendMessengerRemovePacket(const char * c_szKey, const char * c_szName) +{ + TPacketCGMessenger packet; + packet.header = HEADER_CG_MESSENGER; + packet.subheader = MESSENGER_SUBHEADER_CG_REMOVE; + if (!Send(sizeof(packet), &packet)) + return false; + char szKey[CHARACTER_NAME_MAX_LEN]; + strncpy(szKey, c_szKey, CHARACTER_NAME_MAX_LEN-1); + if (!Send(sizeof(szKey), &szKey)) + return false; + __RefreshTargetBoardByName(c_szName); + return SendSequence(); +} + +bool CPythonNetworkStream::SendCharacterStatePacket(const TPixelPosition& c_rkPPosDst, float fDstRot, UINT eFunc, UINT uArg) +{ + NANOBEGIN + if (!__CanActMainInstance()) + return true; + + if (fDstRot < 0.0f) + fDstRot = 360 + fDstRot; + else if (fDstRot > 360.0f) + fDstRot = fmodf(fDstRot, 360.0f); + + // TODO: 나중에 패킷이름을 바꾸자 + TPacketCGMove kStatePacket; + kStatePacket.bHeader = HEADER_CG_CHARACTER_MOVE; + kStatePacket.bFunc = eFunc; + kStatePacket.bArg = uArg; + kStatePacket.bRot = fDstRot/5.0f; + kStatePacket.lX = long(c_rkPPosDst.x); + kStatePacket.lY = long(c_rkPPosDst.y); + kStatePacket.dwTime = ELTimer_GetServerMSec(); + + assert(kStatePacket.lX >= 0 && kStatePacket.lX < 204800); + + __LocalPositionToGlobalPosition(kStatePacket.lX, kStatePacket.lY); + + if (!Send(sizeof(kStatePacket), &kStatePacket)) + { + Tracenf("CPythonNetworkStream::SendCharacterStatePacket(dwCmdTime=%u, fDstPos=(%f, %f), fDstRot=%f, eFunc=%d uArg=%d) - PACKET SEND ERROR", + kStatePacket.dwTime, + float(kStatePacket.lX), + float(kStatePacket.lY), + fDstRot, + kStatePacket.bFunc, + kStatePacket.bArg); + return false; + } + NANOEND + return SendSequence(); +} + +// NOTE : SlotIndex는 임시 +bool CPythonNetworkStream::SendUseSkillPacket(DWORD dwSkillIndex, DWORD dwTargetVID) +{ + TPacketCGUseSkill UseSkillPacket; + UseSkillPacket.bHeader = HEADER_CG_USE_SKILL; + UseSkillPacket.dwVnum = dwSkillIndex; + UseSkillPacket.dwTargetVID = dwTargetVID; + if (!Send(sizeof(TPacketCGUseSkill), &UseSkillPacket)) + { + Tracen("CPythonNetworkStream::SendUseSkillPacket - SEND PACKET ERROR"); + return false; + } + + return SendSequence(); +} + +bool CPythonNetworkStream::SendChatPacket(const char * c_szChat, BYTE byType) +{ + if (strlen(c_szChat) == 0) + return true; + + if (strlen(c_szChat) >= 512) + return true; + + if (c_szChat[0] == '/') + { + if (1 == strlen(c_szChat)) + { + if (!m_strLastCommand.empty()) + c_szChat = m_strLastCommand.c_str(); + } + else + { + m_strLastCommand = c_szChat; + } + } + + if (ClientCommand(c_szChat)) + return true; + + int iTextLen = strlen(c_szChat) + 1; + TPacketCGChat ChatPacket; + ChatPacket.header = HEADER_CG_CHAT; + ChatPacket.length = sizeof(ChatPacket) + iTextLen; + ChatPacket.type = byType; + + if (!Send(sizeof(ChatPacket), &ChatPacket)) + return false; + + if (!Send(iTextLen, c_szChat)) + return false; + + return SendSequence(); +} + +////////////////////////////////////////////////////////////////////////// +// Emoticon +void CPythonNetworkStream::RegisterEmoticonString(const char * pcEmoticonString) +{ + if (m_EmoticonStringVector.size() >= CInstanceBase::EMOTICON_NUM) + { + TraceError("Can't register emoticon string... vector is full (size:%d)", m_EmoticonStringVector.size() ); + return; + } + m_EmoticonStringVector.push_back(pcEmoticonString); +} + +bool CPythonNetworkStream::ParseEmoticon(const char * pChatMsg, DWORD * pdwEmoticon) +{ + for (DWORD dwEmoticonIndex = 0; dwEmoticonIndex < m_EmoticonStringVector.size() ; ++dwEmoticonIndex) + { + if (strlen(pChatMsg) > m_EmoticonStringVector[dwEmoticonIndex].size()) + continue; + + const char * pcFind = strstr(pChatMsg, m_EmoticonStringVector[dwEmoticonIndex].c_str()); + + if (pcFind != pChatMsg) + continue; + + *pdwEmoticon = dwEmoticonIndex; + + return true; + } + + return false; +} +// Emoticon +////////////////////////////////////////////////////////////////////////// + +void CPythonNetworkStream::__ConvertEmpireText(DWORD dwEmpireID, char* szText) +{ + if (dwEmpireID<1 || dwEmpireID>3) + return; + + UINT uHanPos; + + STextConvertTable& rkTextConvTable=m_aTextConvTable[dwEmpireID-1]; + + BYTE* pbText=(BYTE*)szText; + while (*pbText) + { + if (*pbText & 0x80) + { + if (pbText[0]>=0xb0 && pbText[0]<=0xc8 && pbText[1]>=0xa1 && pbText[1]<=0xfe) + { + // PORT: spaces around "-"; "0xfe-0xa1" is one pp-number to clang (MSVC splits it) + uHanPos=(pbText[0]-0xb0)*(0xfe - 0xa1+1)+(pbText[1]-0xa1); + pbText[0]=rkTextConvTable.aacHan[uHanPos][0]; + pbText[1]=rkTextConvTable.aacHan[uHanPos][1]; + } + pbText+=2; + } + else + { + if (*pbText>='a' && *pbText<='z') + { + *pbText=rkTextConvTable.acLower[*pbText-'a']; + } + else if (*pbText>='A' && *pbText<='Z') + { + *pbText=rkTextConvTable.acUpper[*pbText-'A']; + } + pbText++; + } + } +} + +bool CPythonNetworkStream::RecvChatPacket() +{ + TPacketGCChat kChat; + char buf[1024 + 1]; + char line[1024 + 1]; + + if (!Recv(sizeof(kChat), &kChat)) + return false; + + UINT uChatSize=kChat.size - sizeof(kChat); + + if (!Recv(uChatSize, buf)) + return false; + + buf[uChatSize]='\0'; + + // 유럽 아랍 버전 처리 + // "이름: 내용" 입력을 "내용: 이름" 순서로 출력하기 위해 탭(0x08)을 넣음 + // 탭을 아랍어 기호로 처리해 (영어1) : (영어2) 로 입력되어도 (영어2) : (영어1) 로 출력하게 만든다 + if (LocaleService_IsEUROPE() && GetDefaultCodePage() == 1256) + { + char * p = strchr(buf, ':'); + if (p && p[1] == ' ') + p[1] = 0x08; + } + + if (kChat.type >= CHAT_TYPE_MAX_NUM) + return true; + + if (CHAT_TYPE_COMMAND == kChat.type) + { + ServerCommand(buf); + return true; + } + + if (kChat.dwVID != 0) + { + CPythonCharacterManager& rkChrMgr=CPythonCharacterManager::Instance(); + CInstanceBase * pkInstChatter = rkChrMgr.GetInstancePtr(kChat.dwVID); + if (NULL == pkInstChatter) + return true; + + switch (kChat.type) + { + case CHAT_TYPE_TALKING: /* 그냥 채팅 */ + case CHAT_TYPE_PARTY: /* 파티말 */ + case CHAT_TYPE_GUILD: /* 길드말 */ + case CHAT_TYPE_SHOUT: /* 외치기 */ + case CHAT_TYPE_WHISPER: // 서버와는 연동되지 않는 Only Client Enum + { + char * p = strchr(buf, ':'); + + if (p) + p += 2; + else + p = buf; + + DWORD dwEmoticon; + + if (ParseEmoticon(p, &dwEmoticon)) + { + pkInstChatter->SetEmoticon(dwEmoticon); + return true; + } + else + { + if (gs_bEmpireLanuageEnable) + { + CInstanceBase* pkInstMain=rkChrMgr.GetMainInstancePtr(); + if (pkInstMain) + if (!pkInstMain->IsSameEmpire(*pkInstChatter)) + __ConvertEmpireText(pkInstChatter->GetEmpireID(), p); + } + + if (m_isEnableChatInsultFilter) + { + if (false == pkInstChatter->IsNPC() && false == pkInstChatter->IsEnemy()) + { + __FilterInsult(p, strlen(p)); + } + } + + _snprintf(line, sizeof(line), "%s", p); + } + } + break; + case CHAT_TYPE_COMMAND: /* 명령 */ + case CHAT_TYPE_INFO: /* 정보 (아이템을 집었다, 경험치를 얻었다. 등) */ + case CHAT_TYPE_NOTICE: /* 공지사항 */ + case CHAT_TYPE_BIG_NOTICE: + case CHAT_TYPE_MAX_NUM: + default: + _snprintf(line, sizeof(line), "%s", buf); + break; + } + + if (CHAT_TYPE_SHOUT != kChat.type) + { + CPythonTextTail::Instance().RegisterChatTail(kChat.dwVID, line); + } + + if (pkInstChatter->IsPC()) + CPythonChat::Instance().AppendChat(kChat.type, buf); + } + else + { + if (CHAT_TYPE_NOTICE == kChat.type) + { + PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "BINARY_SetTipMessage", Py_BuildValue("(s)", buf)); + } + else if (CHAT_TYPE_BIG_NOTICE == kChat.type) + { + PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "BINARY_SetBigMessage", Py_BuildValue("(s)", buf)); + } + else if (CHAT_TYPE_SHOUT == kChat.type) + { + char * p = strchr(buf, ':'); + + if (p) + { + if (m_isEnableChatInsultFilter) + __FilterInsult(p, strlen(p)); + } + } + + CPythonChat::Instance().AppendChat(kChat.type, buf); + + } + return true; +} + +bool CPythonNetworkStream::RecvWhisperPacket() +{ + TPacketGCWhisper whisperPacket; + char buf[512 + 1]; + + if (!Recv(sizeof(whisperPacket), &whisperPacket)) + return false; + + assert(whisperPacket.wSize - sizeof(whisperPacket) < 512); + + if (!Recv(whisperPacket.wSize - sizeof(whisperPacket), &buf)) + return false; + + buf[whisperPacket.wSize - sizeof(whisperPacket)] = '\0'; + + static char line[256]; + if (CPythonChat::WHISPER_TYPE_CHAT == whisperPacket.bType || CPythonChat::WHISPER_TYPE_GM == whisperPacket.bType) + { + _snprintf(line, sizeof(line), "%s : %s", whisperPacket.szNameFrom, buf); + PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "OnRecvWhisper", Py_BuildValue("(iss)", (int) whisperPacket.bType, whisperPacket.szNameFrom, line)); + } + else if (CPythonChat::WHISPER_TYPE_SYSTEM == whisperPacket.bType || CPythonChat::WHISPER_TYPE_ERROR == whisperPacket.bType) + { + PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "OnRecvWhisperSystemMessage", Py_BuildValue("(iss)", (int) whisperPacket.bType, whisperPacket.szNameFrom, buf)); + } + else + { + PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "OnRecvWhisperError", Py_BuildValue("(iss)", (int) whisperPacket.bType, whisperPacket.szNameFrom, buf)); + } + + return true; +} + +bool CPythonNetworkStream::SendWhisperPacket(const char * name, const char * c_szChat) +{ + if (strlen(c_szChat) >= 255) + return true; + + int iTextLen = strlen(c_szChat) + 1; + TPacketCGWhisper WhisperPacket; + WhisperPacket.bHeader = HEADER_CG_WHISPER; + WhisperPacket.wSize = sizeof(WhisperPacket) + iTextLen; + + strncpy(WhisperPacket.szNameTo, name, sizeof(WhisperPacket.szNameTo) - 1); + + if (!Send(sizeof(WhisperPacket), &WhisperPacket)) + return false; + + if (!Send(iTextLen, c_szChat)) + return false; + + return SendSequence(); +} + +bool CPythonNetworkStream::SendMobileMessagePacket(const char * name, const char * c_szChat) +{ + int iTextLen = strlen(c_szChat) + 1; + TPacketCGSMS SMSPacket; + SMSPacket.bHeader = HEADER_CG_SMS; + SMSPacket.wSize = sizeof(SMSPacket) + iTextLen; + + strncpy(SMSPacket.szNameTo, name, sizeof(SMSPacket.szNameTo) - 1); + + if (!Send(sizeof(SMSPacket), &SMSPacket)) + return false; + + if (!Send(iTextLen, c_szChat)) + return false; + + return SendSequence(); +} + +bool CPythonNetworkStream::RecvPointChange() +{ + TPacketGCPointChange PointChange; + + if (!Recv(sizeof(TPacketGCPointChange), &PointChange)) + { + Tracen("Recv Point Change Packet Error"); + return false; + } + + CPythonCharacterManager& rkChrMgr = CPythonCharacterManager::Instance(); + rkChrMgr.ShowPointEffect(PointChange.Type, PointChange.dwVID); + + CInstanceBase * pInstance = CPythonCharacterManager::Instance().GetMainInstancePtr(); + + // 자신의 Point가 변경되었을 경우.. + if (pInstance) + if (PointChange.dwVID == pInstance->GetVirtualID()) + { + CPythonPlayer & rkPlayer = CPythonPlayer::Instance(); + rkPlayer.SetStatus(PointChange.Type, PointChange.value); + + switch (PointChange.Type) + { + case POINT_STAT_RESET_COUNT: + __RefreshStatus(); + break; + case POINT_LEVEL: + case POINT_ST: + case POINT_DX: + case POINT_HT: + case POINT_IQ: + __RefreshStatus(); + __RefreshSkillWindow(); + break; + case POINT_SKILL: + case POINT_SUB_SKILL: + case POINT_HORSE_SKILL: + __RefreshSkillWindow(); + break; + case POINT_ENERGY: + if (PointChange.value == 0) + { + rkPlayer.SetStatus(POINT_ENERGY_END_TIME, 0); + } + __RefreshStatus(); + break; + default: + __RefreshStatus(); + break; + } + + if (POINT_GOLD == PointChange.Type) + { + if (PointChange.amount > 0) + { + PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "OnPickMoney", Py_BuildValue("(i)", PointChange.amount)); + } + } + } + else + { + if (PointChange.Type == POINT_LEVEL) + { + pInstance = CPythonCharacterManager::Instance().GetInstancePtr(PointChange.dwVID); + if (pInstance) + { + pInstance->SetLevel(PointChange.value); + pInstance->UpdateTextTailLevel(PointChange.value); + } + } + } + + return true; +} + +bool CPythonNetworkStream::RecvStunPacket() +{ + TPacketGCStun StunPacket; + + if (!Recv(sizeof(StunPacket), &StunPacket)) + { + Tracen("CPythonNetworkStream::RecvStunPacket Error"); + return false; + } + + //Tracef("RecvStunPacket %d\n", StunPacket.vid); + + CPythonCharacterManager& rkChrMgr=CPythonCharacterManager::Instance(); + CInstanceBase * pkInstSel = rkChrMgr.GetInstancePtr(StunPacket.vid); + + if (pkInstSel) + { + if (CPythonCharacterManager::Instance().GetMainInstancePtr()==pkInstSel) + pkInstSel->Die(); + else + pkInstSel->Stun(); + } + + return true; +} + +bool CPythonNetworkStream::RecvDeadPacket() +{ + TPacketGCDead DeadPacket; + if (!Recv(sizeof(DeadPacket), &DeadPacket)) + { + Tracen("CPythonNetworkStream::RecvDeadPacket Error"); + return false; + } + + CPythonCharacterManager& rkChrMgr=CPythonCharacterManager::Instance(); + CInstanceBase * pkChrInstSel = rkChrMgr.GetInstancePtr(DeadPacket.vid); + if (pkChrInstSel) + { + CInstanceBase* pkInstMain=rkChrMgr.GetMainInstancePtr(); + if (pkInstMain==pkChrInstSel) + { + Tracenf("\301\326\300\316\260\370 \273\347\270\301"); + if (false == pkInstMain->GetDuelMode()) + { + PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "OnGameOver", Py_BuildValue("()")); + } + CPythonPlayer::Instance().NotifyDeadMainCharacter(); + } + + pkChrInstSel->Die(); + } + + return true; +} + +bool CPythonNetworkStream::SendCharacterPositionPacket(BYTE iPosition) +{ + TPacketCGPosition PositionPacket; + + PositionPacket.header = HEADER_CG_CHARACTER_POSITION; + PositionPacket.position = iPosition; + + if (!Send(sizeof(TPacketCGPosition), &PositionPacket)) + { + Tracen("Send Character Position Packet Error"); + return false; + } + + return SendSequence(); +} + +bool CPythonNetworkStream::SendOnClickPacket(DWORD vid) +{ + TPacketCGOnClick OnClickPacket; + OnClickPacket.header = HEADER_CG_ON_CLICK; + OnClickPacket.vid = vid; + + if (!Send(sizeof(OnClickPacket), &OnClickPacket)) + { + Tracen("Send On_Click Packet Error"); + return false; + } + + Tracef("SendOnClickPacket\n"); + return SendSequence(); +} + +bool CPythonNetworkStream::RecvCharacterPositionPacket() +{ + TPacketGCPosition PositionPacket; + + if (!Recv(sizeof(TPacketGCPosition), &PositionPacket)) + return false; + + CInstanceBase * pChrInstance = CPythonCharacterManager::Instance().GetInstancePtr(PositionPacket.vid); + + if (!pChrInstance) + return true; + + //pChrInstance->UpdatePosition(PositionPacket.position); + + return true; +} + +bool CPythonNetworkStream::RecvMotionPacket() +{ + TPacketGCMotion MotionPacket; + + if (!Recv(sizeof(TPacketGCMotion), &MotionPacket)) + return false; + + CInstanceBase * pMainInstance = CPythonCharacterManager::Instance().GetInstancePtr(MotionPacket.vid); + CInstanceBase * pVictimInstance = NULL; + + if (0 != MotionPacket.victim_vid) + pVictimInstance = CPythonCharacterManager::Instance().GetInstancePtr(MotionPacket.victim_vid); + + if (!pMainInstance) + return false; + + return true; +} + +bool CPythonNetworkStream::RecvShopPacket() +{ + std::vector vecBuffer; + vecBuffer.clear(); + + TPacketGCShop packet_shop; + if (!Recv(sizeof(packet_shop), &packet_shop)) + return false; + + int iSize = packet_shop.size - sizeof(packet_shop); + if (iSize > 0) + { + vecBuffer.resize(iSize); + if (!Recv(iSize, &vecBuffer[0])) + return false; + } + + switch (packet_shop.subheader) + { + case SHOP_SUBHEADER_GC_START: + { + CPythonShop::Instance().Clear(); + + DWORD dwVID = *(DWORD *)&vecBuffer[0]; + + TPacketGCShopStart * pShopStartPacket = (TPacketGCShopStart *)&vecBuffer[4]; + for (BYTE iItemIndex = 0; iItemIndex < SHOP_HOST_ITEM_MAX_NUM; ++iItemIndex) + { + CPythonShop::Instance().SetItemData(iItemIndex, pShopStartPacket->items[iItemIndex]); + } + + PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "StartShop", Py_BuildValue("(i)", dwVID)); + } + break; + + case SHOP_SUBHEADER_GC_START_EX: + { + CPythonShop::Instance().Clear(); + + TPacketGCShopStartEx * pShopStartPacket = (TPacketGCShopStartEx *)&vecBuffer[0]; + size_t read_point = sizeof(TPacketGCShopStartEx); + + DWORD dwVID = pShopStartPacket->owner_vid; + BYTE shop_tab_count = pShopStartPacket->shop_tab_count; + + CPythonShop::instance().SetTabCount(shop_tab_count); + + for (unsigned char i = 0; i < shop_tab_count; i++) + { + TPacketGCShopStartEx::TSubPacketShopTab* pPackTab = (TPacketGCShopStartEx::TSubPacketShopTab*)&vecBuffer[read_point]; + read_point += sizeof(TPacketGCShopStartEx::TSubPacketShopTab); + + CPythonShop::instance().SetTabCoinType(i, pPackTab->coin_type); + CPythonShop::instance().SetTabName(i, pPackTab->name); + + struct packet_shop_item* item = &pPackTab->items[0]; + + for (BYTE j = 0; j < SHOP_HOST_ITEM_MAX_NUM; j++) + { + TShopItemData* itemData = (item + j); + CPythonShop::Instance().SetItemData(i, j, *itemData); + } + } + + PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "StartShop", Py_BuildValue("(i)", dwVID)); + } + break; + + + case SHOP_SUBHEADER_GC_END: + PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "EndShop", Py_BuildValue("()")); + break; + + case SHOP_SUBHEADER_GC_UPDATE_ITEM: + { + TPacketGCShopUpdateItem * pShopUpdateItemPacket = (TPacketGCShopUpdateItem *)&vecBuffer[0]; + CPythonShop::Instance().SetItemData(pShopUpdateItemPacket->pos, pShopUpdateItemPacket->item); + PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "RefreshShop", Py_BuildValue("()")); + } + break; + + case SHOP_SUBHEADER_GC_UPDATE_PRICE: + PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "SetShopSellingPrice", Py_BuildValue("(i)", *(int *)&vecBuffer[0])); + break; + + case SHOP_SUBHEADER_GC_NOT_ENOUGH_MONEY: + PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "OnShopError", Py_BuildValue("(s)", "NOT_ENOUGH_MONEY")); + break; + + case SHOP_SUBHEADER_GC_NOT_ENOUGH_MONEY_EX: + PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "OnShopError", Py_BuildValue("(s)", "NOT_ENOUGH_MONEY_EX")); + break; + + case SHOP_SUBHEADER_GC_SOLDOUT: + PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "OnShopError", Py_BuildValue("(s)", "SOLDOUT")); + break; + + case SHOP_SUBHEADER_GC_INVENTORY_FULL: + PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "OnShopError", Py_BuildValue("(s)", "INVENTORY_FULL")); + break; + + case SHOP_SUBHEADER_GC_INVALID_POS: + PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "OnShopError", Py_BuildValue("(s)", "INVALID_POS")); + break; + + default: + TraceError("CPythonNetworkStream::RecvShopPacket: Unknown subheader\n"); + break; + } + + return true; +} + +bool CPythonNetworkStream::RecvExchangePacket() +{ + TPacketGCExchange exchange_packet; + + if (!Recv(sizeof(exchange_packet), &exchange_packet)) + return false; + + switch (exchange_packet.subheader) + { + case EXCHANGE_SUBHEADER_GC_START: + CPythonExchange::Instance().Clear(); + CPythonExchange::Instance().Start(); + CPythonExchange::Instance().SetSelfName(CPythonPlayer::Instance().GetName()); + + { + CInstanceBase * pCharacterInstance = CPythonCharacterManager::Instance().GetInstancePtr(exchange_packet.arg1); + + if (pCharacterInstance) + CPythonExchange::Instance().SetTargetName(pCharacterInstance->GetNameString()); + } + + PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "StartExchange", Py_BuildValue("()")); + break; + + case EXCHANGE_SUBHEADER_GC_ITEM_ADD: + if (exchange_packet.is_me) + { + int iSlotIndex = exchange_packet.arg2.cell; + CPythonExchange::Instance().SetItemToSelf(iSlotIndex, exchange_packet.arg1, (BYTE) exchange_packet.arg3); + for (int i = 0; i < ITEM_SOCKET_SLOT_MAX_NUM; ++i) + CPythonExchange::Instance().SetItemMetinSocketToSelf(iSlotIndex, i, exchange_packet.alValues[i]); + for (int j = 0; j < ITEM_ATTRIBUTE_SLOT_MAX_NUM; ++j) + CPythonExchange::Instance().SetItemAttributeToSelf(iSlotIndex, j, exchange_packet.aAttr[j].bType, exchange_packet.aAttr[j].sValue); + } + else + { + int iSlotIndex = exchange_packet.arg2.cell; + CPythonExchange::Instance().SetItemToTarget(iSlotIndex, exchange_packet.arg1, (BYTE) exchange_packet.arg3); + for (int i = 0; i < ITEM_SOCKET_SLOT_MAX_NUM; ++i) + CPythonExchange::Instance().SetItemMetinSocketToTarget(iSlotIndex, i, exchange_packet.alValues[i]); + for (int j = 0; j < ITEM_ATTRIBUTE_SLOT_MAX_NUM; ++j) + CPythonExchange::Instance().SetItemAttributeToTarget(iSlotIndex, j, exchange_packet.aAttr[j].bType, exchange_packet.aAttr[j].sValue); + } + + __RefreshExchangeWindow(); + __RefreshInventoryWindow(); + break; + + case EXCHANGE_SUBHEADER_GC_ITEM_DEL: + if (exchange_packet.is_me) + { + CPythonExchange::Instance().DelItemOfSelf((BYTE) exchange_packet.arg1); + } + else + { + CPythonExchange::Instance().DelItemOfTarget((BYTE) exchange_packet.arg1); + } + __RefreshExchangeWindow(); + __RefreshInventoryWindow(); + break; + + case EXCHANGE_SUBHEADER_GC_ELK_ADD: + if (exchange_packet.is_me) + CPythonExchange::Instance().SetElkToSelf(exchange_packet.arg1); + else + CPythonExchange::Instance().SetElkToTarget(exchange_packet.arg1); + + __RefreshExchangeWindow(); + break; + + case EXCHANGE_SUBHEADER_GC_ACCEPT: + if (exchange_packet.is_me) + { + CPythonExchange::Instance().SetAcceptToSelf((BYTE) exchange_packet.arg1); + } + else + { + CPythonExchange::Instance().SetAcceptToTarget((BYTE) exchange_packet.arg1); + } + __RefreshExchangeWindow(); + break; + + case EXCHANGE_SUBHEADER_GC_END: + PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "EndExchange", Py_BuildValue("()")); + __RefreshInventoryWindow(); + CPythonExchange::Instance().End(); + break; + + case EXCHANGE_SUBHEADER_GC_ALREADY: + Tracef("trade_already"); + break; + + case EXCHANGE_SUBHEADER_GC_LESS_ELK: + Tracef("trade_less_elk"); + break; + }; + + return true; +} + +bool CPythonNetworkStream::RecvQuestInfoPacket() +{ + TPacketGCQuestInfo QuestInfo; + + if (!Peek(sizeof(TPacketGCQuestInfo), &QuestInfo)) + { + Tracen("Recv Quest Info Packet Error #1"); + return false; + } + + if (!Peek(QuestInfo.size)) + { + Tracen("Recv Quest Info Packet Error #2"); + return false; + } + + Recv(sizeof(TPacketGCQuestInfo)); + + const BYTE & c_rFlag = QuestInfo.flag; + + enum + { + QUEST_PACKET_TYPE_NONE, + QUEST_PACKET_TYPE_BEGIN, + QUEST_PACKET_TYPE_UPDATE, + QUEST_PACKET_TYPE_END, + }; + + BYTE byQuestPacketType = QUEST_PACKET_TYPE_NONE; + + if (0 != (c_rFlag & QUEST_SEND_IS_BEGIN)) + { + BYTE isBegin; + if (!Recv(sizeof(isBegin), &isBegin)) + return false; + + if (isBegin) + byQuestPacketType = QUEST_PACKET_TYPE_BEGIN; + else + byQuestPacketType = QUEST_PACKET_TYPE_END; + } + else + { + byQuestPacketType = QUEST_PACKET_TYPE_UPDATE; + } + + // Recv Data Start + char szTitle[30 + 1] = ""; + char szClockName[16 + 1] = ""; + int iClockValue = 0; + char szCounterName[16 + 1] = ""; + int iCounterValue = 0; + char szIconFileName[24 + 1] = ""; + + if (0 != (c_rFlag & QUEST_SEND_TITLE)) + { + if (!Recv(sizeof(szTitle), &szTitle)) + return false; + + szTitle[30]='\0'; + } + if (0 != (c_rFlag & QUEST_SEND_CLOCK_NAME)) + { + if (!Recv(sizeof(szClockName), &szClockName)) + return false; + + szClockName[16]='\0'; + } + if (0 != (c_rFlag & QUEST_SEND_CLOCK_VALUE)) + { + if (!Recv(sizeof(iClockValue), &iClockValue)) + return false; + } + if (0 != (c_rFlag & QUEST_SEND_COUNTER_NAME)) + { + if (!Recv(sizeof(szCounterName), &szCounterName)) + return false; + + szCounterName[16]='\0'; + } + if (0 != (c_rFlag & QUEST_SEND_COUNTER_VALUE)) + { + if (!Recv(sizeof(iCounterValue), &iCounterValue)) + return false; + } + if (0 != (c_rFlag & QUEST_SEND_ICON_FILE)) + { + if (!Recv(sizeof(szIconFileName), &szIconFileName)) + return false; + + szIconFileName[24]='\0'; + } + // Recv Data End + + CPythonQuest& rkQuest=CPythonQuest::Instance(); + + // Process Start + if (QUEST_PACKET_TYPE_END == byQuestPacketType) + { + rkQuest.DeleteQuestInstance(QuestInfo.index); + } + else if (QUEST_PACKET_TYPE_UPDATE == byQuestPacketType) + { + if (!rkQuest.IsQuest(QuestInfo.index)) + { + rkQuest.MakeQuest(QuestInfo.index); + } + + if (strlen(szTitle) > 0) + rkQuest.SetQuestTitle(QuestInfo.index, szTitle); + if (strlen(szClockName) > 0) + rkQuest.SetQuestClockName(QuestInfo.index, szClockName); + if (strlen(szCounterName) > 0) + rkQuest.SetQuestCounterName(QuestInfo.index, szCounterName); + if (strlen(szIconFileName) > 0) + rkQuest.SetQuestIconFileName(QuestInfo.index, szIconFileName); + + if (c_rFlag & QUEST_SEND_CLOCK_VALUE) + rkQuest.SetQuestClockValue(QuestInfo.index, iClockValue); + if (c_rFlag & QUEST_SEND_COUNTER_VALUE) + rkQuest.SetQuestCounterValue(QuestInfo.index, iCounterValue); + } + else if (QUEST_PACKET_TYPE_BEGIN == byQuestPacketType) + { + CPythonQuest::SQuestInstance QuestInstance; + QuestInstance.dwIndex = QuestInfo.index; + QuestInstance.strTitle = szTitle; + QuestInstance.strClockName = szClockName; + QuestInstance.iClockValue = iClockValue; + QuestInstance.strCounterName = szCounterName; + QuestInstance.iCounterValue = iCounterValue; + QuestInstance.strIconFileName = szIconFileName; + CPythonQuest::Instance().RegisterQuestInstance(QuestInstance); + } + // Process Start End + + PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "RefreshQuest", Py_BuildValue("()")); + return true; +} + +bool CPythonNetworkStream::RecvQuestConfirmPacket() +{ + TPacketGCQuestConfirm kQuestConfirmPacket; + if (!Recv(sizeof(kQuestConfirmPacket), &kQuestConfirmPacket)) + { + Tracen("RecvQuestConfirmPacket Error"); + return false; + } + + PyObject * poArg = Py_BuildValue("(sii)", kQuestConfirmPacket.msg, kQuestConfirmPacket.timeout, kQuestConfirmPacket.requestPID); + PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "BINARY_OnQuestConfirm", poArg); + return true; +} + +bool CPythonNetworkStream::RecvRequestMakeGuild() +{ + TPacketGCBlank blank; + if (!Recv(sizeof(blank), &blank)) + { + Tracen("RecvRequestMakeGuild Packet Error"); + return false; + } + + PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "AskGuildName", Py_BuildValue("()")); + + return true; +} + +void CPythonNetworkStream::ToggleGameDebugInfo() +{ + PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "ToggleDebugInfo", Py_BuildValue("()")); +} + +bool CPythonNetworkStream::SendExchangeStartPacket(DWORD vid) +{ + if (!__CanActMainInstance()) + return true; + + TPacketCGExchange packet; + + packet.header = HEADER_CG_EXCHANGE; + packet.subheader = EXCHANGE_SUBHEADER_CG_START; + packet.arg1 = vid; + + if (!Send(sizeof(packet), &packet)) + { + Tracef("send_trade_start_packet Error\n"); + return false; + } + + Tracef("send_trade_start_packet vid %d \n", vid); + return SendSequence(); +} + +bool CPythonNetworkStream::SendExchangeElkAddPacket(DWORD elk) +{ + if (!__CanActMainInstance()) + return true; + + TPacketCGExchange packet; + + packet.header = HEADER_CG_EXCHANGE; + packet.subheader = EXCHANGE_SUBHEADER_CG_ELK_ADD; + packet.arg1 = elk; + + if (!Send(sizeof(packet), &packet)) + { + Tracef("send_trade_elk_add_packet Error\n"); + return false; + } + + return SendSequence(); +} + +bool CPythonNetworkStream::SendExchangeItemAddPacket(TItemPos ItemPos, BYTE byDisplayPos) +{ + if (!__CanActMainInstance()) + return true; + + TPacketCGExchange packet; + + packet.header = HEADER_CG_EXCHANGE; + packet.subheader = EXCHANGE_SUBHEADER_CG_ITEM_ADD; + packet.Pos = ItemPos; + packet.arg2 = byDisplayPos; + + if (!Send(sizeof(packet), &packet)) + { + Tracef("send_trade_item_add_packet Error\n"); + return false; + } + + return SendSequence(); +} + +bool CPythonNetworkStream::SendExchangeItemDelPacket(BYTE pos) +{ + assert(!"Can't be called function - CPythonNetworkStream::SendExchangeItemDelPacket"); + return true; + + if (!__CanActMainInstance()) + return true; + + TPacketCGExchange packet; + + packet.header = HEADER_CG_EXCHANGE; + packet.subheader = EXCHANGE_SUBHEADER_CG_ITEM_DEL; + packet.arg1 = pos; + + if (!Send(sizeof(packet), &packet)) + { + Tracef("send_trade_item_del_packet Error\n"); + return false; + } + + return SendSequence(); +} + +bool CPythonNetworkStream::SendExchangeAcceptPacket() +{ + if (!__CanActMainInstance()) + return true; + + TPacketCGExchange packet; + + packet.header = HEADER_CG_EXCHANGE; + packet.subheader = EXCHANGE_SUBHEADER_CG_ACCEPT; + + if (!Send(sizeof(packet), &packet)) + { + Tracef("send_trade_accept_packet Error\n"); + return false; + } + + return SendSequence(); +} + +bool CPythonNetworkStream::SendExchangeExitPacket() +{ + if (!__CanActMainInstance()) + return true; + + TPacketCGExchange packet; + + packet.header = HEADER_CG_EXCHANGE; + packet.subheader = EXCHANGE_SUBHEADER_CG_CANCEL; + + if (!Send(sizeof(packet), &packet)) + { + Tracef("send_trade_exit_packet Error\n"); + return false; + } + + return SendSequence(); +} + +// PointReset 개임시 +bool CPythonNetworkStream::SendPointResetPacket() +{ + PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "StartPointReset", Py_BuildValue("()")); + return true; +} + +bool CPythonNetworkStream::__IsPlayerAttacking() +{ + CPythonCharacterManager& rkChrMgr=CPythonCharacterManager::Instance(); + CInstanceBase* pkInstMain=rkChrMgr.GetMainInstancePtr(); + if (!pkInstMain) + return false; + + if (!pkInstMain->IsAttacking()) + return false; + + return true; +} + +bool CPythonNetworkStream::RecvScriptPacket() +{ + TPacketGCScript ScriptPacket; + + if (!Recv(sizeof(TPacketGCScript), &ScriptPacket)) + { + TraceError("RecvScriptPacket_RecvError"); + return false; + } + + if (ScriptPacket.size < sizeof(TPacketGCScript)) + { + TraceError("RecvScriptPacket_SizeError"); + return false; + } + + ScriptPacket.size -= sizeof(TPacketGCScript); + + static std::string str; + str = ""; + str.resize(ScriptPacket.size+1); + + if (!Recv(ScriptPacket.size, &str[0])) + return false; + + str[str.size()-1] = '\0'; + + int iIndex = CPythonEventManager::Instance().RegisterEventSetFromString(str); + + if (-1 != iIndex) + { + CPythonEventManager::Instance().SetVisibleLineCount(iIndex, 30); + CPythonNetworkStream::Instance().OnScriptEventStart(ScriptPacket.skin,iIndex); + } + + return true; +} + +bool CPythonNetworkStream::SendScriptAnswerPacket(int iAnswer) +{ + TPacketCGScriptAnswer ScriptAnswer; + + ScriptAnswer.header = HEADER_CG_SCRIPT_ANSWER; + ScriptAnswer.answer = (BYTE) iAnswer; + if (!Send(sizeof(TPacketCGScriptAnswer), &ScriptAnswer)) + { + Tracen("Send Script Answer Packet Error"); + return false; + } + + return SendSequence(); +} + +bool CPythonNetworkStream::SendScriptButtonPacket(unsigned int iIndex) +{ + TPacketCGScriptButton ScriptButton; + + ScriptButton.header = HEADER_CG_SCRIPT_BUTTON; + ScriptButton.idx = iIndex; + if (!Send(sizeof(TPacketCGScriptButton), &ScriptButton)) + { + Tracen("Send Script Button Packet Error"); + return false; + } + + return SendSequence(); +} + +bool CPythonNetworkStream::SendAnswerMakeGuildPacket(const char * c_szName) +{ + TPacketCGAnswerMakeGuild Packet; + + Packet.header = HEADER_CG_ANSWER_MAKE_GUILD; + strncpy(Packet.guild_name, c_szName, GUILD_NAME_MAX_LEN); + Packet.guild_name[GUILD_NAME_MAX_LEN] = '\0'; + + if (!Send(sizeof(Packet), &Packet)) + { + Tracen("SendAnswerMakeGuild Packet Error"); + return false; + } + +// Tracef(" SendAnswerMakeGuildPacket : %s", c_szName); + return SendSequence(); +} + +bool CPythonNetworkStream::SendQuestInputStringPacket(const char * c_szString) +{ + TPacketCGQuestInputString Packet; + Packet.bHeader = HEADER_CG_QUEST_INPUT_STRING; + strncpy(Packet.szString, c_szString, QUEST_INPUT_STRING_MAX_NUM); + + if (!Send(sizeof(Packet), &Packet)) + { + Tracen("SendQuestInputStringPacket Error"); + return false; + } + + return SendSequence(); +} + +bool CPythonNetworkStream::SendQuestConfirmPacket(BYTE byAnswer, DWORD dwPID) +{ + TPacketCGQuestConfirm kPacket; + kPacket.header = HEADER_CG_QUEST_CONFIRM; + kPacket.answer = byAnswer; + kPacket.requestPID = dwPID; + + if (!Send(sizeof(kPacket), &kPacket)) + { + Tracen("SendQuestConfirmPacket Error"); + return false; + } + + Tracenf(" SendQuestConfirmPacket : %d, %d", byAnswer, dwPID); + return SendSequence(); +} + +bool CPythonNetworkStream::RecvSkillCoolTimeEnd() +{ + TPacketGCSkillCoolTimeEnd kPacketSkillCoolTimeEnd; + if (!Recv(sizeof(kPacketSkillCoolTimeEnd), &kPacketSkillCoolTimeEnd)) + { + Tracen("CPythonNetworkStream::RecvSkillCoolTimeEnd - RecvError"); + return false; + } + + CPythonPlayer::Instance().EndSkillCoolTime(kPacketSkillCoolTimeEnd.bSkill); + + return true; +} + +bool CPythonNetworkStream::RecvSkillLevel() +{ + assert(!"CPythonNetworkStream::RecvSkillLevel - \273\347\277\353\307\317\301\366 \276\312\264\302 \307\324\274\366"); + TPacketGCSkillLevel packet; + if (!Recv(sizeof(TPacketGCSkillLevel), &packet)) + { + Tracen("CPythonNetworkStream::RecvSkillLevel - RecvError"); + return false; + } + + DWORD dwSlotIndex; + + CPythonPlayer& rkPlayer=CPythonPlayer::Instance(); + for (int i = 0; i < SKILL_MAX_NUM; ++i) + { + if (rkPlayer.GetSkillSlotIndex(i, &dwSlotIndex)) + rkPlayer.SetSkillLevel(dwSlotIndex, packet.abSkillLevels[i]); + } + + __RefreshSkillWindow(); + __RefreshStatus(); + Tracef(" >> RecvSkillLevel\n"); + return true; +} + +bool CPythonNetworkStream::RecvSkillLevelNew() +{ + TPacketGCSkillLevelNew packet; + + if (!Recv(sizeof(TPacketGCSkillLevelNew), &packet)) + { + Tracen("CPythonNetworkStream::RecvSkillLevelNew - RecvError"); + return false; + } + + CPythonPlayer& rkPlayer=CPythonPlayer::Instance(); + + rkPlayer.SetSkill(7, 0); + rkPlayer.SetSkill(8, 0); + + for (int i = 0; i < SKILL_MAX_NUM; ++i) + { + TPlayerSkill & rPlayerSkill = packet.skills[i]; + + if (i >= 112 && i <= 115 && rPlayerSkill.bLevel) + rkPlayer.SetSkill(7, i); + + if (i >= 116 && i <= 119 && rPlayerSkill.bLevel) + rkPlayer.SetSkill(8, i); + + rkPlayer.SetSkillLevel_(i, rPlayerSkill.bMasterType, rPlayerSkill.bLevel); + } + + __RefreshSkillWindow(); + __RefreshStatus(); + //Tracef(" >> RecvSkillLevelNew\n"); + return true; +} + + +bool CPythonNetworkStream::RecvDamageInfoPacket() +{ + TPacketGCDamageInfo DamageInfoPacket; + + if (!Recv(sizeof(TPacketGCDamageInfo), &DamageInfoPacket)) + { + Tracen("Recv Target Packet Error"); + return false; + } + + CInstanceBase * pInstTarget = CPythonCharacterManager::Instance().GetInstancePtr(DamageInfoPacket.dwVID); + bool bSelf = (pInstTarget == CPythonCharacterManager::Instance().GetMainInstancePtr()); + bool bTarget = (pInstTarget==m_pInstTarget); + if (pInstTarget) + { + if(DamageInfoPacket.damage >= 0) + pInstTarget->AddDamageEffect(DamageInfoPacket.damage,DamageInfoPacket.flag,bSelf,bTarget); + else + TraceError("Damage is equal or below 0."); + } + + return true; +} +bool CPythonNetworkStream::RecvTargetPacket() +{ + TPacketGCTarget TargetPacket; + + if (!Recv(sizeof(TPacketGCTarget), &TargetPacket)) + { + Tracen("Recv Target Packet Error"); + return false; + } + + CInstanceBase * pInstPlayer = CPythonCharacterManager::Instance().GetMainInstancePtr(); + CInstanceBase * pInstTarget = CPythonCharacterManager::Instance().GetInstancePtr(TargetPacket.dwVID); + if (pInstPlayer && pInstTarget) + { + if (!pInstTarget->IsDead()) + { + if (pInstTarget->IsPC() || pInstTarget->IsBuilding()) + PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "CloseTargetBoardIfDifferent", Py_BuildValue("(i)", TargetPacket.dwVID)); + else if (pInstPlayer->CanViewTargetHP(*pInstTarget)) + PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "SetHPTargetBoard", Py_BuildValue("(ii)", TargetPacket.dwVID, TargetPacket.bHPPercent)); + else + PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "CloseTargetBoard", Py_BuildValue("()")); + + m_pInstTarget = pInstTarget; + } + } + else + { + PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "CloseTargetBoard", Py_BuildValue("()")); + } + + return true; +} + +bool CPythonNetworkStream::RecvMountPacket() +{ + TPacketGCMount MountPacket; + + if (!Recv(sizeof(TPacketGCMount), &MountPacket)) + { + Tracen("Recv Mount Packet Error"); + return false; + } + + CInstanceBase * pInstance = CPythonCharacterManager::Instance().GetInstancePtr(MountPacket.vid); + + if (pInstance) + { + // Mount + if (0 != MountPacket.mount_vid) + { +// pInstance->Ride(MountPacket.pos, MountPacket.mount_vid); + } + // Unmount + else + { +// pInstance->Unride(MountPacket.pos, MountPacket.x, MountPacket.y); + } + } + + if (CPythonPlayer::Instance().IsMainCharacterIndex(MountPacket.vid)) + { +// CPythonPlayer::Instance().SetRidingVehicleIndex(MountPacket.mount_vid); + } + + return true; +} + +bool CPythonNetworkStream::RecvChangeSpeedPacket() +{ + TPacketGCChangeSpeed SpeedPacket; + + if (!Recv(sizeof(TPacketGCChangeSpeed), &SpeedPacket)) + { + Tracen("Recv Speed Packet Error"); + return false; + } + + CInstanceBase * pInstance = CPythonCharacterManager::Instance().GetInstancePtr(SpeedPacket.vid); + + if (!pInstance) + return true; + +// pInstance->SetWalkSpeed(SpeedPacket.walking_speed); +// pInstance->SetRunSpeed(SpeedPacket.running_speed); + return true; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////// +// Recv + +bool CPythonNetworkStream::SendAttackPacket(UINT uMotAttack, DWORD dwVIDVictim) +{ + if (!__CanActMainInstance()) + return true; + +#ifdef ATTACK_TIME_LOG + static DWORD prevTime = timeGetTime(); + DWORD curTime = timeGetTime(); + TraceError("TIME: %.4f(%.4f) ATTACK_PACKET: %d TARGET: %d", curTime/1000.0f, (curTime-prevTime)/1000.0f, uMotAttack, dwVIDVictim); + prevTime = curTime; +#endif + + TPacketCGAttack kPacketAtk; + + kPacketAtk.header = HEADER_CG_ATTACK; + kPacketAtk.bType = uMotAttack; + kPacketAtk.dwVictimVID = dwVIDVictim; + + if (!SendSpecial(sizeof(kPacketAtk), &kPacketAtk)) + { + Tracen("Send Battle Attack Packet Error"); + return false; + } + + return SendSequence(); +} + +bool CPythonNetworkStream::SendSpecial(int nLen, void * pvBuf) +{ + BYTE bHeader = *(BYTE *) pvBuf; + + switch (bHeader) + { + case HEADER_CG_ATTACK: + { + TPacketCGAttack * pkPacketAtk = (TPacketCGAttack *) pvBuf; + pkPacketAtk->bCRCMagicCubeProcPiece = GetProcessCRCMagicCubePiece(); + pkPacketAtk->bCRCMagicCubeFilePiece = GetProcessCRCMagicCubePiece(); + return Send(nLen, pvBuf); + } + break; + } + + return Send(nLen, pvBuf); +} + +bool CPythonNetworkStream::RecvAddFlyTargetingPacket() +{ + TPacketGCFlyTargeting kPacket; + if (!Recv(sizeof(kPacket), &kPacket)) + return false; + + __GlobalPositionToLocalPosition(kPacket.lX, kPacket.lY); + + Tracef("VID [%d]\260\241 \305\270\260\331\300\273 \303\337\260\241 \274\263\301\244\n",kPacket.dwShooterVID); + + CPythonCharacterManager & rpcm = CPythonCharacterManager::Instance(); + + CInstanceBase * pShooter = rpcm.GetInstancePtr(kPacket.dwShooterVID); + + if (!pShooter) + { +#ifndef _DEBUG + TraceError("CPythonNetworkStream::RecvFlyTargetingPacket() - dwShooterVID[%d] NOT EXIST", kPacket.dwShooterVID); +#endif + return true; + } + + CInstanceBase * pTarget = rpcm.GetInstancePtr(kPacket.dwTargetVID); + + if (kPacket.dwTargetVID && pTarget) + { + pShooter->GetGraphicThingInstancePtr()->AddFlyTarget(pTarget->GetGraphicThingInstancePtr()); + } + else + { + float h = CPythonBackground::Instance().GetHeight(kPacket.lX,kPacket.lY) + 60.0f; // TEMPORARY HEIGHT + pShooter->GetGraphicThingInstancePtr()->AddFlyTarget(D3DXVECTOR3(kPacket.lX,kPacket.lY,h)); + //pShooter->GetGraphicThingInstancePtr()->SetFlyTarget(kPacket.kPPosTarget.x,kPacket.kPPosTarget.y,); + } + + return true; +} + +bool CPythonNetworkStream::RecvFlyTargetingPacket() +{ + TPacketGCFlyTargeting kPacket; + if (!Recv(sizeof(kPacket), &kPacket)) + return false; + + __GlobalPositionToLocalPosition(kPacket.lX, kPacket.lY); + + //Tracef("CPythonNetworkStream::RecvFlyTargetingPacket - VID [%d]\n",kPacket.dwShooterVID); + + CPythonCharacterManager & rpcm = CPythonCharacterManager::Instance(); + + CInstanceBase * pShooter = rpcm.GetInstancePtr(kPacket.dwShooterVID); + + if (!pShooter) + { +#ifdef _DEBUG + TraceError("CPythonNetworkStream::RecvFlyTargetingPacket() - dwShooterVID[%d] NOT EXIST", kPacket.dwShooterVID); +#endif + return true; + } + + CInstanceBase * pTarget = rpcm.GetInstancePtr(kPacket.dwTargetVID); + + if (kPacket.dwTargetVID && pTarget) + { + pShooter->GetGraphicThingInstancePtr()->SetFlyTarget(pTarget->GetGraphicThingInstancePtr()); + } + else + { + float h = CPythonBackground::Instance().GetHeight(kPacket.lX, kPacket.lY) + 60.0f; // TEMPORARY HEIGHT + pShooter->GetGraphicThingInstancePtr()->SetFlyTarget(D3DXVECTOR3(kPacket.lX,kPacket.lY,h)); + //pShooter->GetGraphicThingInstancePtr()->SetFlyTarget(kPacket.kPPosTarget.x,kPacket.kPPosTarget.y,); + } + + return true; +} + +bool CPythonNetworkStream::SendShootPacket(UINT uSkill) +{ + TPacketCGShoot kPacketShoot; + kPacketShoot.bHeader=HEADER_CG_SHOOT; + kPacketShoot.bType=uSkill; + + if (!Send(sizeof(kPacketShoot), &kPacketShoot)) + { + Tracen("SendShootPacket Error"); + return false; + } + + return SendSequence(); +} + +bool CPythonNetworkStream::SendAddFlyTargetingPacket(DWORD dwTargetVID, const TPixelPosition & kPPosTarget) +{ + TPacketCGFlyTargeting packet; + + //CPythonCharacterManager & rpcm = CPythonCharacterManager::Instance(); + + packet.bHeader = HEADER_CG_ADD_FLY_TARGETING; + packet.dwTargetVID = dwTargetVID; + packet.lX = kPPosTarget.x; + packet.lY = kPPosTarget.y; + + __LocalPositionToGlobalPosition(packet.lX, packet.lY); + + if (!Send(sizeof(packet), &packet)) + { + Tracen("Send FlyTargeting Packet Error"); + return false; + } + + return SendSequence(); +} + + +bool CPythonNetworkStream::SendFlyTargetingPacket(DWORD dwTargetVID, const TPixelPosition & kPPosTarget) +{ + TPacketCGFlyTargeting packet; + + //CPythonCharacterManager & rpcm = CPythonCharacterManager::Instance(); + + packet.bHeader = HEADER_CG_FLY_TARGETING; + packet.dwTargetVID = dwTargetVID; + packet.lX = kPPosTarget.x; + packet.lY = kPPosTarget.y; + + __LocalPositionToGlobalPosition(packet.lX, packet.lY); + + if (!Send(sizeof(packet), &packet)) + { + Tracen("Send FlyTargeting Packet Error"); + return false; + } + + return SendSequence(); +} + +bool CPythonNetworkStream::RecvCreateFlyPacket() +{ + TPacketGCCreateFly kPacket; + if (!Recv(sizeof(TPacketGCCreateFly), &kPacket)) + return false; + + CFlyingManager& rkFlyMgr = CFlyingManager::Instance(); + CPythonCharacterManager & rkChrMgr = CPythonCharacterManager::Instance(); + + CInstanceBase * pkStartInst = rkChrMgr.GetInstancePtr(kPacket.dwStartVID); + CInstanceBase * pkEndInst = rkChrMgr.GetInstancePtr(kPacket.dwEndVID); + if (!pkStartInst || !pkEndInst) + return true; + + rkFlyMgr.CreateIndexedFly(kPacket.bType, pkStartInst->GetGraphicThingInstancePtr(), pkEndInst->GetGraphicThingInstancePtr()); + + return true; +} + +bool CPythonNetworkStream::SendTargetPacket(DWORD dwVID) +{ + TPacketCGTarget packet; + packet.header = HEADER_CG_TARGET; + packet.dwVID = dwVID; + + if (!Send(sizeof(packet), &packet)) + { + Tracen("Send Target Packet Error"); + return false; + } + + return SendSequence(); +} + +bool CPythonNetworkStream::SendSyncPositionElementPacket(DWORD dwVictimVID, DWORD dwVictimX, DWORD dwVictimY) +{ + TPacketCGSyncPositionElement kSyncPos; + kSyncPos.dwVID=dwVictimVID; + kSyncPos.lX=dwVictimX; + kSyncPos.lY=dwVictimY; + + __LocalPositionToGlobalPosition(kSyncPos.lX, kSyncPos.lY); + + if (!Send(sizeof(kSyncPos), &kSyncPos)) + { + Tracen("CPythonNetworkStream::SendSyncPositionElementPacket - ERROR"); + return false; + } + + return true; +} + +bool CPythonNetworkStream::RecvMessenger() +{ + TPacketGCMessenger p; + if (!Recv(sizeof(p), &p)) + return false; + + int iSize = p.size - sizeof(p); + char char_name[24+1]; + + switch (p.subheader) + { + case MESSENGER_SUBHEADER_GC_LIST: + { + TPacketGCMessengerListOnline on; + while(iSize) + { + if (!Recv(sizeof(TPacketGCMessengerListOffline),&on)) + return false; + + if (!Recv(on.length, char_name)) + return false; + + char_name[on.length] = 0; + + if (on.connected & MESSENGER_CONNECTED_STATE_ONLINE) + CPythonMessenger::Instance().OnFriendLogin(char_name); + else + CPythonMessenger::Instance().OnFriendLogout(char_name); + + if (on.connected & MESSENGER_CONNECTED_STATE_MOBILE) + CPythonMessenger::Instance().SetMobile(char_name, TRUE); + + iSize -= sizeof(TPacketGCMessengerListOffline); + iSize -= on.length; + } + break; + } + + case MESSENGER_SUBHEADER_GC_LOGIN: + { + TPacketGCMessengerLogin p; + if (!Recv(sizeof(p),&p)) + return false; + if (!Recv(p.length, char_name)) + return false; + char_name[p.length] = 0; + CPythonMessenger::Instance().OnFriendLogin(char_name); + __RefreshTargetBoardByName(char_name); + break; + } + + case MESSENGER_SUBHEADER_GC_LOGOUT: + { + TPacketGCMessengerLogout logout; + if (!Recv(sizeof(logout),&logout)) + return false; + if (!Recv(logout.length, char_name)) + return false; + char_name[logout.length] = 0; + CPythonMessenger::Instance().OnFriendLogout(char_name); + break; + } + + case MESSENGER_SUBHEADER_GC_MOBILE: + { + BYTE byState; // 모바일 번호가 없어졌는지 플래그 + BYTE byLength; + if (!Recv(sizeof(byState), &byState)) + return false; + if (!Recv(sizeof(byLength), &byLength)) + return false; + if (!Recv(byLength, char_name)) + return false; + char_name[byLength] = 0; + CPythonMessenger::Instance().SetMobile(char_name, byState); + break; + } + } + return true; +} + +////////////////////////////////////////////////////////////////////////// +// Party + +bool CPythonNetworkStream::SendPartyInvitePacket(DWORD dwVID) +{ + TPacketCGPartyInvite kPartyInvitePacket; + kPartyInvitePacket.header = HEADER_CG_PARTY_INVITE; + kPartyInvitePacket.vid = dwVID; + + if (!Send(sizeof(kPartyInvitePacket), &kPartyInvitePacket)) + { + Tracenf("CPythonNetworkStream::SendPartyInvitePacket [%ud] - PACKET SEND ERROR", dwVID); + return false; + } + + Tracef(" << SendPartyInvitePacket : %d\n", dwVID); + return SendSequence(); +} + +bool CPythonNetworkStream::SendPartyInviteAnswerPacket(DWORD dwLeaderVID, BYTE byAnswer) +{ + TPacketCGPartyInviteAnswer kPartyInviteAnswerPacket; + kPartyInviteAnswerPacket.header = HEADER_CG_PARTY_INVITE_ANSWER; + kPartyInviteAnswerPacket.leader_pid = dwLeaderVID; + kPartyInviteAnswerPacket.accept = byAnswer; + + if (!Send(sizeof(kPartyInviteAnswerPacket), &kPartyInviteAnswerPacket)) + { + Tracenf("CPythonNetworkStream::SendPartyInviteAnswerPacket [%ud %ud] - PACKET SEND ERROR", dwLeaderVID, byAnswer); + return false; + } + + Tracef(" << SendPartyInviteAnswerPacket : %d, %d\n", dwLeaderVID, byAnswer); + return SendSequence(); +} + +bool CPythonNetworkStream::SendPartyRemovePacket(DWORD dwPID) +{ + TPacketCGPartyRemove kPartyInviteRemove; + kPartyInviteRemove.header = HEADER_CG_PARTY_REMOVE; + kPartyInviteRemove.pid = dwPID; + + if (!Send(sizeof(kPartyInviteRemove), &kPartyInviteRemove)) + { + Tracenf("CPythonNetworkStream::SendPartyRemovePacket [%ud] - PACKET SEND ERROR", dwPID); + return false; + } + + Tracef(" << SendPartyRemovePacket : %d\n", dwPID); + return SendSequence(); +} + +bool CPythonNetworkStream::SendPartySetStatePacket(DWORD dwVID, BYTE byState, BYTE byFlag) +{ + TPacketCGPartySetState kPartySetState; + kPartySetState.byHeader = HEADER_CG_PARTY_SET_STATE; + kPartySetState.dwVID = dwVID; + kPartySetState.byState = byState; + kPartySetState.byFlag = byFlag; + + if (!Send(sizeof(kPartySetState), &kPartySetState)) + { + Tracenf("CPythonNetworkStream::SendPartySetStatePacket(%ud, %ud) - PACKET SEND ERROR", dwVID, byState); + return false; + } + + Tracef(" << SendPartySetStatePacket : %d, %d, %d\n", dwVID, byState, byFlag); + return SendSequence(); +} + +bool CPythonNetworkStream::SendPartyUseSkillPacket(BYTE bySkillIndex, DWORD dwVID) +{ + TPacketCGPartyUseSkill kPartyUseSkill; + kPartyUseSkill.byHeader = HEADER_CG_PARTY_USE_SKILL; + kPartyUseSkill.bySkillIndex = bySkillIndex; + kPartyUseSkill.dwTargetVID = dwVID; + + if (!Send(sizeof(kPartyUseSkill), &kPartyUseSkill)) + { + Tracenf("CPythonNetworkStream::SendPartyUseSkillPacket(%ud, %ud) - PACKET SEND ERROR", bySkillIndex, dwVID); + return false; + } + + Tracef(" << SendPartyUseSkillPacket : %d, %d\n", bySkillIndex, dwVID); + return SendSequence(); +} + +bool CPythonNetworkStream::SendPartyParameterPacket(BYTE byDistributeMode) +{ + TPacketCGPartyParameter kPartyParameter; + kPartyParameter.bHeader = HEADER_CG_PARTY_PARAMETER; + kPartyParameter.bDistributeMode = byDistributeMode; + + if (!Send(sizeof(kPartyParameter), &kPartyParameter)) + { + Tracenf("CPythonNetworkStream::SendPartyParameterPacket(%d) - PACKET SEND ERROR", byDistributeMode); + return false; + } + + Tracef(" << SendPartyParameterPacket : %d\n", byDistributeMode); + return SendSequence(); +} + +bool CPythonNetworkStream::RecvPartyInvite() +{ + TPacketGCPartyInvite kPartyInvitePacket; + if (!Recv(sizeof(kPartyInvitePacket), &kPartyInvitePacket)) + return false; + + CInstanceBase * pInstance = CPythonCharacterManager::Instance().GetInstancePtr(kPartyInvitePacket.leader_pid); + if (!pInstance) + { + TraceError(" CPythonNetworkStream::RecvPartyInvite - Failed to find leader instance [%d]\n", kPartyInvitePacket.leader_pid); + return true; + } + + PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "RecvPartyInviteQuestion", Py_BuildValue("(is)", kPartyInvitePacket.leader_pid, pInstance->GetNameString())); + Tracef(" >> RecvPartyInvite : %d, %s\n", kPartyInvitePacket.leader_pid, pInstance->GetNameString()); + + return true; +} + +bool CPythonNetworkStream::RecvPartyAdd() +{ + TPacketGCPartyAdd kPartyAddPacket; + if (!Recv(sizeof(kPartyAddPacket), &kPartyAddPacket)) + return false; + + CPythonPlayer::Instance().AppendPartyMember(kPartyAddPacket.pid, kPartyAddPacket.name); + PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "AddPartyMember", Py_BuildValue("(is)", kPartyAddPacket.pid, kPartyAddPacket.name)); + Tracef(" >> RecvPartyAdd : %d, %s\n", kPartyAddPacket.pid, kPartyAddPacket.name); + + return true; +} + +bool CPythonNetworkStream::RecvPartyUpdate() +{ + TPacketGCPartyUpdate kPartyUpdatePacket; + if (!Recv(sizeof(kPartyUpdatePacket), &kPartyUpdatePacket)) + return false; + + CPythonPlayer::TPartyMemberInfo * pPartyMemberInfo; + if (!CPythonPlayer::Instance().GetPartyMemberPtr(kPartyUpdatePacket.pid, &pPartyMemberInfo)) + return true; + + BYTE byOldState = pPartyMemberInfo->byState; + + CPythonPlayer::Instance().UpdatePartyMemberInfo(kPartyUpdatePacket.pid, kPartyUpdatePacket.state, kPartyUpdatePacket.percent_hp); + for (int i = 0; i < PARTY_AFFECT_SLOT_MAX_NUM; ++i) + { + CPythonPlayer::Instance().UpdatePartyMemberAffect(kPartyUpdatePacket.pid, i, kPartyUpdatePacket.affects[i]); + } + + PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "UpdatePartyMemberInfo", Py_BuildValue("(i)", kPartyUpdatePacket.pid)); + + // 만약 리더가 바뀌었다면, TargetBoard 의 버튼을 업데이트 한다. + DWORD dwVID; + if (CPythonPlayer::Instance().PartyMemberPIDToVID(kPartyUpdatePacket.pid, &dwVID)) + if (byOldState != kPartyUpdatePacket.state) + { + __RefreshTargetBoardByVID(dwVID); + } + +// Tracef(" >> RecvPartyUpdate : %d, %d, %d\n", kPartyUpdatePacket.pid, kPartyUpdatePacket.state, kPartyUpdatePacket.percent_hp); + + return true; +} + +bool CPythonNetworkStream::RecvPartyRemove() +{ + TPacketGCPartyRemove kPartyRemovePacket; + if (!Recv(sizeof(kPartyRemovePacket), &kPartyRemovePacket)) + return false; + + PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "RemovePartyMember", Py_BuildValue("(i)", kPartyRemovePacket.pid)); + Tracef(" >> RecvPartyRemove : %d\n", kPartyRemovePacket.pid); + + return true; +} + +bool CPythonNetworkStream::RecvPartyLink() +{ + TPacketGCPartyLink kPartyLinkPacket; + if (!Recv(sizeof(kPartyLinkPacket), &kPartyLinkPacket)) + return false; + + CPythonPlayer::Instance().LinkPartyMember(kPartyLinkPacket.pid, kPartyLinkPacket.vid); + PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "LinkPartyMember", Py_BuildValue("(ii)", kPartyLinkPacket.pid, kPartyLinkPacket.vid)); + Tracef(" >> RecvPartyLink : %d, %d\n", kPartyLinkPacket.pid, kPartyLinkPacket.vid); + + return true; +} + +bool CPythonNetworkStream::RecvPartyUnlink() +{ + TPacketGCPartyUnlink kPartyUnlinkPacket; + if (!Recv(sizeof(kPartyUnlinkPacket), &kPartyUnlinkPacket)) + return false; + + CPythonPlayer::Instance().UnlinkPartyMember(kPartyUnlinkPacket.pid); + + if (CPythonPlayer::Instance().IsMainCharacterIndex(kPartyUnlinkPacket.vid)) + { + PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "UnlinkAllPartyMember", Py_BuildValue("()")); + } + else + { + PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "UnlinkPartyMember", Py_BuildValue("(i)", kPartyUnlinkPacket.pid)); + } + + Tracef(" >> RecvPartyUnlink : %d, %d\n", kPartyUnlinkPacket.pid, kPartyUnlinkPacket.vid); + + return true; +} + +bool CPythonNetworkStream::RecvPartyParameter() +{ + TPacketGCPartyParameter kPartyParameterPacket; + if (!Recv(sizeof(kPartyParameterPacket), &kPartyParameterPacket)) + return false; + + PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "ChangePartyParameter", Py_BuildValue("(i)", kPartyParameterPacket.bDistributeMode)); + Tracef(" >> RecvPartyParameter : %d\n", kPartyParameterPacket.bDistributeMode); + + return true; +} + +// Party +////////////////////////////////////////////////////////////////////////// + + +////////////////////////////////////////////////////////////////////////// +// Guild + +bool CPythonNetworkStream::SendGuildAddMemberPacket(DWORD dwVID) +{ + TPacketCGGuild GuildPacket; + GuildPacket.byHeader = HEADER_CG_GUILD; + GuildPacket.bySubHeader = GUILD_SUBHEADER_CG_ADD_MEMBER; + if (!Send(sizeof(GuildPacket), &GuildPacket)) + return false; + if (!Send(sizeof(dwVID), &dwVID)) + return false; + + Tracef(" SendGuildAddMemberPacket\n", dwVID); + return SendSequence(); +} + +bool CPythonNetworkStream::SendGuildRemoveMemberPacket(DWORD dwPID) +{ + TPacketCGGuild GuildPacket; + GuildPacket.byHeader = HEADER_CG_GUILD; + GuildPacket.bySubHeader = GUILD_SUBHEADER_CG_REMOVE_MEMBER; + if (!Send(sizeof(GuildPacket), &GuildPacket)) + return false; + if (!Send(sizeof(dwPID), &dwPID)) + return false; + + Tracef(" SendGuildRemoveMemberPacket %d\n", dwPID); + return SendSequence(); +} + +bool CPythonNetworkStream::SendGuildChangeGradeNamePacket(BYTE byGradeNumber, const char * c_szName) +{ + TPacketCGGuild GuildPacket; + GuildPacket.byHeader = HEADER_CG_GUILD; + GuildPacket.bySubHeader = GUILD_SUBHEADER_CG_CHANGE_GRADE_NAME; + if (!Send(sizeof(GuildPacket), &GuildPacket)) + return false; + if (!Send(sizeof(byGradeNumber), &byGradeNumber)) + return false; + + char szName[GUILD_GRADE_NAME_MAX_LEN+1]; + strncpy(szName, c_szName, GUILD_GRADE_NAME_MAX_LEN); + szName[GUILD_GRADE_NAME_MAX_LEN] = '\0'; + + if (!Send(sizeof(szName), &szName)) + return false; + + Tracef(" SendGuildChangeGradeNamePacket %d, %s\n", byGradeNumber, c_szName); + return SendSequence(); +} + +bool CPythonNetworkStream::SendGuildChangeGradeAuthorityPacket(BYTE byGradeNumber, BYTE byAuthority) +{ + TPacketCGGuild GuildPacket; + GuildPacket.byHeader = HEADER_CG_GUILD; + GuildPacket.bySubHeader = GUILD_SUBHEADER_CG_CHANGE_GRADE_AUTHORITY; + if (!Send(sizeof(GuildPacket), &GuildPacket)) + return false; + if (!Send(sizeof(byGradeNumber), &byGradeNumber)) + return false; + if (!Send(sizeof(byAuthority), &byAuthority)) + return false; + + Tracef(" SendGuildChangeGradeAuthorityPacket %d, %d\n", byGradeNumber, byAuthority); + return SendSequence(); +} + +bool CPythonNetworkStream::SendGuildOfferPacket(DWORD dwExperience) +{ + TPacketCGGuild GuildPacket; + GuildPacket.byHeader = HEADER_CG_GUILD; + GuildPacket.bySubHeader = GUILD_SUBHEADER_CG_OFFER; + if (!Send(sizeof(GuildPacket), &GuildPacket)) + return false; + if (!Send(sizeof(dwExperience), &dwExperience)) + return false; + + Tracef(" SendGuildOfferPacket %d\n", dwExperience); + return SendSequence(); +} + +bool CPythonNetworkStream::SendGuildPostCommentPacket(const char * c_szMessage) +{ + TPacketCGGuild GuildPacket; + GuildPacket.byHeader = HEADER_CG_GUILD; + GuildPacket.bySubHeader = GUILD_SUBHEADER_CG_POST_COMMENT; + if (!Send(sizeof(GuildPacket), &GuildPacket)) + return false; + + BYTE bySize = BYTE(strlen(c_szMessage)) + 1; + if (!Send(sizeof(bySize), &bySize)) + return false; + if (!Send(bySize, c_szMessage)) + return false; + + Tracef(" SendGuildPostCommentPacket %d, %s\n", bySize, c_szMessage); + return SendSequence(); +} + +bool CPythonNetworkStream::SendGuildDeleteCommentPacket(DWORD dwIndex) +{ + TPacketCGGuild GuildPacket; + GuildPacket.byHeader = HEADER_CG_GUILD; + GuildPacket.bySubHeader = GUILD_SUBHEADER_CG_DELETE_COMMENT; + if (!Send(sizeof(GuildPacket), &GuildPacket)) + return false; + + if (!Send(sizeof(dwIndex), &dwIndex)) + return false; + + Tracef(" SendGuildDeleteCommentPacket %d\n", dwIndex); + return SendSequence(); +} + +bool CPythonNetworkStream::SendGuildRefreshCommentsPacket(DWORD dwHighestIndex) +{ + static DWORD s_LastTime = timeGetTime() - 1001; + + if (timeGetTime() - s_LastTime < 1000) + return true; + s_LastTime = timeGetTime(); + + TPacketCGGuild GuildPacket; + GuildPacket.byHeader = HEADER_CG_GUILD; + GuildPacket.bySubHeader = GUILD_SUBHEADER_CG_REFRESH_COMMENT; + if (!Send(sizeof(GuildPacket), &GuildPacket)) + return false; + + Tracef(" SendGuildRefreshCommentPacket %d\n", dwHighestIndex); + return SendSequence(); +} + +bool CPythonNetworkStream::SendGuildChangeMemberGradePacket(DWORD dwPID, BYTE byGrade) +{ + TPacketCGGuild GuildPacket; + GuildPacket.byHeader = HEADER_CG_GUILD; + GuildPacket.bySubHeader = GUILD_SUBHEADER_CG_CHANGE_MEMBER_GRADE; + if (!Send(sizeof(GuildPacket), &GuildPacket)) + return false; + + if (!Send(sizeof(dwPID), &dwPID)) + return false; + if (!Send(sizeof(byGrade), &byGrade)) + return false; + + Tracef(" SendGuildChangeMemberGradePacket %d, %d\n", dwPID, byGrade); + return SendSequence(); +} + +bool CPythonNetworkStream::SendGuildUseSkillPacket(DWORD dwSkillID, DWORD dwTargetVID) +{ + TPacketCGGuild GuildPacket; + GuildPacket.byHeader = HEADER_CG_GUILD; + GuildPacket.bySubHeader = GUILD_SUBHEADER_CG_USE_SKILL; + if (!Send(sizeof(GuildPacket), &GuildPacket)) + return false; + + if (!Send(sizeof(dwSkillID), &dwSkillID)) + return false; + if (!Send(sizeof(dwTargetVID), &dwTargetVID)) + return false; + + Tracef(" SendGuildUseSkillPacket %d, %d\n", dwSkillID, dwTargetVID); + return SendSequence(); +} + +bool CPythonNetworkStream::SendGuildChangeMemberGeneralPacket(DWORD dwPID, BYTE byFlag) +{ + TPacketCGGuild GuildPacket; + GuildPacket.byHeader = HEADER_CG_GUILD; + GuildPacket.bySubHeader = GUILD_SUBHEADER_CG_CHANGE_MEMBER_GENERAL; + if (!Send(sizeof(GuildPacket), &GuildPacket)) + return false; + + if (!Send(sizeof(dwPID), &dwPID)) + return false; + if (!Send(sizeof(byFlag), &byFlag)) + return false; + + Tracef(" SendGuildChangeMemberGeneralFlagPacket %d, %d\n", dwPID, byFlag); + return SendSequence(); +} + +bool CPythonNetworkStream::SendGuildInviteAnswerPacket(DWORD dwGuildID, BYTE byAnswer) +{ + TPacketCGGuild GuildPacket; + GuildPacket.byHeader = HEADER_CG_GUILD; + GuildPacket.bySubHeader = GUILD_SUBHEADER_CG_GUILD_INVITE_ANSWER; + if (!Send(sizeof(GuildPacket), &GuildPacket)) + return false; + + if (!Send(sizeof(dwGuildID), &dwGuildID)) + return false; + if (!Send(sizeof(byAnswer), &byAnswer)) + return false; + + Tracef(" SendGuildInviteAnswerPacket %d, %d\n", dwGuildID, byAnswer); + return SendSequence(); +} + +bool CPythonNetworkStream::SendGuildChargeGSPPacket(DWORD dwMoney) +{ + TPacketCGGuild GuildPacket; + GuildPacket.byHeader = HEADER_CG_GUILD; + GuildPacket.bySubHeader = GUILD_SUBHEADER_CG_CHARGE_GSP; + if (!Send(sizeof(GuildPacket), &GuildPacket)) + return false; + + if (!Send(sizeof(dwMoney), &dwMoney)) + return false; + + Tracef(" SendGuildChargeGSPPacket %d\n", dwMoney); + return SendSequence(); +} + +bool CPythonNetworkStream::SendGuildDepositMoneyPacket(DWORD dwMoney) +{ + TPacketCGGuild GuildPacket; + GuildPacket.byHeader = HEADER_CG_GUILD; + GuildPacket.bySubHeader = GUILD_SUBHEADER_CG_DEPOSIT_MONEY; + if (!Send(sizeof(GuildPacket), &GuildPacket)) + return false; + if (!Send(sizeof(dwMoney), &dwMoney)) + return false; + + Tracef(" SendGuildDepositMoneyPacket %d\n", dwMoney); + return SendSequence(); +} + +bool CPythonNetworkStream::SendGuildWithdrawMoneyPacket(DWORD dwMoney) +{ + TPacketCGGuild GuildPacket; + GuildPacket.byHeader = HEADER_CG_GUILD; + GuildPacket.bySubHeader = GUILD_SUBHEADER_CG_WITHDRAW_MONEY; + if (!Send(sizeof(GuildPacket), &GuildPacket)) + return false; + if (!Send(sizeof(dwMoney), &dwMoney)) + return false; + + Tracef(" SendGuildWithdrawMoneyPacket %d\n", dwMoney); + return SendSequence(); +} + +bool CPythonNetworkStream::RecvGuild() +{ + TPacketGCGuild GuildPacket; + if (!Recv(sizeof(GuildPacket), &GuildPacket)) + return false; + + switch(GuildPacket.subheader) + { + case GUILD_SUBHEADER_GC_LOGIN: + { + DWORD dwPID; + if (!Recv(sizeof(DWORD), &dwPID)) + return false; + + // Messenger + CPythonGuild::TGuildMemberData * pGuildMemberData; + if (CPythonGuild::Instance().GetMemberDataPtrByPID(dwPID, &pGuildMemberData)) + if (0 != pGuildMemberData->strName.compare(CPythonPlayer::Instance().GetName())) + CPythonMessenger::Instance().LoginGuildMember(pGuildMemberData->strName.c_str()); + + //Tracef(" %d\n", dwPID); + break; + } + case GUILD_SUBHEADER_GC_LOGOUT: + { + DWORD dwPID; + if (!Recv(sizeof(DWORD), &dwPID)) + return false; + + // Messenger + CPythonGuild::TGuildMemberData * pGuildMemberData; + if (CPythonGuild::Instance().GetMemberDataPtrByPID(dwPID, &pGuildMemberData)) + if (0 != pGuildMemberData->strName.compare(CPythonPlayer::Instance().GetName())) + CPythonMessenger::Instance().LogoutGuildMember(pGuildMemberData->strName.c_str()); + + //Tracef(" %d\n", dwPID); + break; + } + case GUILD_SUBHEADER_GC_REMOVE: + { + DWORD dwPID; + if (!Recv(sizeof(dwPID), &dwPID)) + return false; + + // Main Player 일 경우 DeleteGuild + if (CPythonGuild::Instance().IsMainPlayer(dwPID)) + { + CPythonGuild::Instance().Destroy(); + PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "DeleteGuild", Py_BuildValue("()")); + CPythonMessenger::Instance().RemoveAllGuildMember(); + __SetGuildID(0); + __RefreshMessengerWindow(); + __RefreshTargetBoard(); + __RefreshCharacterWindow(); + } + else + { + // Get Member Name + std::string strMemberName = ""; + CPythonGuild::TGuildMemberData * pData; + if (CPythonGuild::Instance().GetMemberDataPtrByPID(dwPID, &pData)) + { + strMemberName = pData->strName; + CPythonMessenger::Instance().RemoveGuildMember(pData->strName.c_str()); + } + + CPythonGuild::Instance().RemoveMember(dwPID); + + // Refresh + __RefreshTargetBoardByName(strMemberName.c_str()); + __RefreshGuildWindowMemberPage(); + } + + Tracef(" %d\n", dwPID); + break; + } + case GUILD_SUBHEADER_GC_LIST: + { + int iPacketSize = int(GuildPacket.size) - sizeof(GuildPacket); + + for (; iPacketSize > 0;) + { + TPacketGCGuildSubMember memberPacket; + if (!Recv(sizeof(memberPacket), &memberPacket)) + return false; + + char szName[CHARACTER_NAME_MAX_LEN+1] = ""; + if (memberPacket.byNameFlag) + { + if (!Recv(sizeof(szName), &szName)) + return false; + + iPacketSize -= CHARACTER_NAME_MAX_LEN+1; + } + else + { + CPythonGuild::TGuildMemberData * pMemberData; + if (CPythonGuild::Instance().GetMemberDataPtrByPID(memberPacket.pid, &pMemberData)) + { + strncpy(szName, pMemberData->strName.c_str(), CHARACTER_NAME_MAX_LEN); + } + } + + //Tracef(" %d : %s, %d (%d, %d, %d)\n", memberPacket.pid, szName, memberPacket.byGrade, memberPacket.byJob, memberPacket.byLevel, memberPacket.dwOffer); + + CPythonGuild::SGuildMemberData GuildMemberData; + GuildMemberData.dwPID = memberPacket.pid; + GuildMemberData.byGrade = memberPacket.byGrade; + GuildMemberData.strName = szName; + GuildMemberData.byJob = memberPacket.byJob; + GuildMemberData.byLevel = memberPacket.byLevel; + GuildMemberData.dwOffer = memberPacket.dwOffer; + GuildMemberData.byGeneralFlag = memberPacket.byIsGeneral; + CPythonGuild::Instance().RegisterMember(GuildMemberData); + + // Messenger + if (strcmp(szName, CPythonPlayer::Instance().GetName())) + CPythonMessenger::Instance().AppendGuildMember(szName); + + __RefreshTargetBoardByName(szName); + + iPacketSize -= sizeof(memberPacket); + } + + __RefreshGuildWindowInfoPage(); + __RefreshGuildWindowMemberPage(); + __RefreshMessengerWindow(); + __RefreshCharacterWindow(); + break; + } + case GUILD_SUBHEADER_GC_GRADE: + { + BYTE byCount; + if (!Recv(sizeof(byCount), &byCount)) + return false; + + for (BYTE i = 0; i < byCount; ++ i) + { + BYTE byIndex; + if (!Recv(sizeof(byCount), &byIndex)) + return false; + TPacketGCGuildSubGrade GradePacket; + if (!Recv(sizeof(GradePacket), &GradePacket)) + return false; + + auto data = CPythonGuild::SGuildGradeData(GradePacket.auth_flag, GradePacket.grade_name); + CPythonGuild::Instance().SetGradeData(byIndex, data); + //Tracef(" [%d/%d] : %s, %d\n", byIndex, byCount, GradePacket.grade_name, GradePacket.auth_flag); + } + __RefreshGuildWindowGradePage(); + __RefreshGuildWindowMemberPageGradeComboBox(); + break; + } + case GUILD_SUBHEADER_GC_GRADE_NAME: + { + BYTE byGradeNumber; + if (!Recv(sizeof(byGradeNumber), &byGradeNumber)) + return false; + + char szGradeName[GUILD_GRADE_NAME_MAX_LEN+1] = ""; + if (!Recv(sizeof(szGradeName), &szGradeName)) + return false; + + CPythonGuild::Instance().SetGradeName(byGradeNumber, szGradeName); + PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "RefreshGuildGrade", Py_BuildValue("()")); + + Tracef(" %d, %s\n", byGradeNumber, szGradeName); + __RefreshGuildWindowGradePage(); + __RefreshGuildWindowMemberPageGradeComboBox(); + break; + } + case GUILD_SUBHEADER_GC_GRADE_AUTH: + { + BYTE byGradeNumber; + if (!Recv(sizeof(byGradeNumber), &byGradeNumber)) + return false; + BYTE byAuthorityFlag; + if (!Recv(sizeof(byAuthorityFlag), &byAuthorityFlag)) + return false; + + CPythonGuild::Instance().SetGradeAuthority(byGradeNumber, byAuthorityFlag); + PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "RefreshGuildGrade", Py_BuildValue("()")); + + Tracef(" %d, %d\n", byGradeNumber, byAuthorityFlag); + __RefreshGuildWindowGradePage(); + break; + } + case GUILD_SUBHEADER_GC_INFO: + { + TPacketGCGuildInfo GuildInfo; + if (!Recv(sizeof(GuildInfo), &GuildInfo)) + return false; + + CPythonGuild::Instance().EnableGuild(); + CPythonGuild::TGuildInfo & rGuildInfo = CPythonGuild::Instance().GetGuildInfoRef(); + strncpy(rGuildInfo.szGuildName, GuildInfo.name, GUILD_NAME_MAX_LEN); + rGuildInfo.szGuildName[GUILD_NAME_MAX_LEN] = '\0'; + + rGuildInfo.dwGuildID = GuildInfo.guild_id; + rGuildInfo.dwMasterPID = GuildInfo.master_pid; + rGuildInfo.dwGuildLevel = GuildInfo.level; + rGuildInfo.dwCurrentExperience = GuildInfo.exp; + rGuildInfo.dwCurrentMemberCount = GuildInfo.member_count; + rGuildInfo.dwMaxMemberCount = GuildInfo.max_member_count; + rGuildInfo.dwGuildMoney = GuildInfo.gold; + rGuildInfo.bHasLand = GuildInfo.hasLand; + + //Tracef(" %s, %d, %d : %d\n", GuildInfo.name, GuildInfo.master_pid, GuildInfo.level, rGuildInfo.bHasLand); + __RefreshGuildWindowInfoPage(); + break; + } + case GUILD_SUBHEADER_GC_COMMENTS: + { + BYTE byCount; + if (!Recv(sizeof(byCount), &byCount)) + return false; + + CPythonGuild::Instance().ClearComment(); + //Tracef(" >>> Comments Count : %d\n", byCount); + + for (BYTE i = 0; i < byCount; ++i) + { + DWORD dwCommentID; + if (!Recv(sizeof(dwCommentID), &dwCommentID)) + return false; + + char szName[CHARACTER_NAME_MAX_LEN+1] = ""; + if (!Recv(sizeof(szName), &szName)) + return false; + + char szComment[GULID_COMMENT_MAX_LEN+1] = ""; + if (!Recv(sizeof(szComment), &szComment)) + return false; + + //Tracef(" [Comment-%d] : %s, %s\n", dwCommentID, szName, szComment); + CPythonGuild::Instance().RegisterComment(dwCommentID, szName, szComment); + } + + __RefreshGuildWindowBoardPage(); + break; + } + case GUILD_SUBHEADER_GC_CHANGE_EXP: + { + BYTE byLevel; + if (!Recv(sizeof(byLevel), &byLevel)) + return false; + DWORD dwEXP; + if (!Recv(sizeof(dwEXP), &dwEXP)) + return false; + CPythonGuild::Instance().SetGuildEXP(byLevel, dwEXP); + Tracef(" %d, %d\n", byLevel, dwEXP); + __RefreshGuildWindowInfoPage(); + break; + } + case GUILD_SUBHEADER_GC_CHANGE_MEMBER_GRADE: + { + DWORD dwPID; + if (!Recv(sizeof(dwPID), &dwPID)) + return false; + BYTE byGrade; + if (!Recv(sizeof(byGrade), &byGrade)) + return false; + CPythonGuild::Instance().ChangeGuildMemberGrade(dwPID, byGrade); + Tracef(" %d, %d\n", dwPID, byGrade); + __RefreshGuildWindowMemberPage(); + break; + } + case GUILD_SUBHEADER_GC_SKILL_INFO: + { + CPythonGuild::TGuildSkillData & rSkillData = CPythonGuild::Instance().GetGuildSkillDataRef(); + if (!Recv(sizeof(rSkillData.bySkillPoint), &rSkillData.bySkillPoint)) + return false; + if (!Recv(sizeof(rSkillData.bySkillLevel), rSkillData.bySkillLevel)) + return false; + if (!Recv(sizeof(rSkillData.wGuildPoint), &rSkillData.wGuildPoint)) + return false; + if (!Recv(sizeof(rSkillData.wMaxGuildPoint), &rSkillData.wMaxGuildPoint)) + return false; + + Tracef(" %d / %d, %d\n", rSkillData.bySkillPoint, rSkillData.wGuildPoint, rSkillData.wMaxGuildPoint); + __RefreshGuildWindowSkillPage(); + break; + } + case GUILD_SUBHEADER_GC_CHANGE_MEMBER_GENERAL: + { + DWORD dwPID; + if (!Recv(sizeof(dwPID), &dwPID)) + return false; + BYTE byFlag; + if (!Recv(sizeof(byFlag), &byFlag)) + return false; + + CPythonGuild::Instance().ChangeGuildMemberGeneralFlag(dwPID, byFlag); + Tracef(" %d, %d\n", dwPID, byFlag); + __RefreshGuildWindowMemberPage(); + break; + } + case GUILD_SUBHEADER_GC_GUILD_INVITE: + { + DWORD dwGuildID; + if (!Recv(sizeof(dwGuildID), &dwGuildID)) + return false; + char szGuildName[GUILD_NAME_MAX_LEN+1]; + if (!Recv(GUILD_NAME_MAX_LEN, &szGuildName)) + return false; + + szGuildName[GUILD_NAME_MAX_LEN] = 0; + + PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "RecvGuildInviteQuestion", Py_BuildValue("(is)", dwGuildID, szGuildName)); + Tracef(" %d, %s\n", dwGuildID, szGuildName); + break; + } + case GUILD_SUBHEADER_GC_WAR: + { + TPacketGCGuildWar kGuildWar; + if (!Recv(sizeof(kGuildWar), &kGuildWar)) + return false; + + switch (kGuildWar.bWarState) + { + case GUILD_WAR_SEND_DECLARE: + Tracef(" >> GUILD_SUBHEADER_GC_WAR : GUILD_WAR_SEND_DECLARE\n"); + PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], + "BINARY_GuildWar_OnSendDeclare", + Py_BuildValue("(i)", kGuildWar.dwGuildOpp) + ); + break; + case GUILD_WAR_RECV_DECLARE: + Tracef(" >> GUILD_SUBHEADER_GC_WAR : GUILD_WAR_RECV_DECLARE\n"); + PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], + "BINARY_GuildWar_OnRecvDeclare", + Py_BuildValue("(ii)", kGuildWar.dwGuildOpp, kGuildWar.bType) + ); + break; + case GUILD_WAR_ON_WAR: + Tracef(" >> GUILD_SUBHEADER_GC_WAR : GUILD_WAR_ON_WAR : %d, %d\n", kGuildWar.dwGuildSelf, kGuildWar.dwGuildOpp); + PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], + "BINARY_GuildWar_OnStart", + Py_BuildValue("(ii)", kGuildWar.dwGuildSelf, kGuildWar.dwGuildOpp) + ); + CPythonGuild::Instance().StartGuildWar(kGuildWar.dwGuildOpp); + break; + case GUILD_WAR_END: + Tracef(" >> GUILD_SUBHEADER_GC_WAR : GUILD_WAR_END\n"); + PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], + "BINARY_GuildWar_OnEnd", + Py_BuildValue("(ii)", kGuildWar.dwGuildSelf, kGuildWar.dwGuildOpp) + ); + CPythonGuild::Instance().EndGuildWar(kGuildWar.dwGuildOpp); + break; + } + break; + } + case GUILD_SUBHEADER_GC_GUILD_NAME: + { + DWORD dwID; + char szGuildName[GUILD_NAME_MAX_LEN+1]; + + int iPacketSize = int(GuildPacket.size) - sizeof(GuildPacket); + + int nItemSize = sizeof(dwID) + GUILD_NAME_MAX_LEN; + + assert(iPacketSize%nItemSize==0 && "GUILD_SUBHEADER_GC_GUILD_NAME"); + + for (; iPacketSize > 0;) + { + if (!Recv(sizeof(dwID), &dwID)) + return false; + + if (!Recv(GUILD_NAME_MAX_LEN, &szGuildName)) + return false; + + szGuildName[GUILD_NAME_MAX_LEN] = 0; + + //Tracef(" >> GulidName [%d : %s]\n", dwID, szGuildName); + CPythonGuild::Instance().RegisterGuildName(dwID, szGuildName); + iPacketSize -= nItemSize; + } + break; + } + case GUILD_SUBHEADER_GC_GUILD_WAR_LIST: + { + DWORD dwSrcGuildID; + DWORD dwDstGuildID; + + int iPacketSize = int(GuildPacket.size) - sizeof(GuildPacket); + int nItemSize = sizeof(dwSrcGuildID) + sizeof(dwDstGuildID); + + assert(iPacketSize%nItemSize==0 && "GUILD_SUBHEADER_GC_GUILD_WAR_LIST"); + + for (; iPacketSize > 0;) + { + if (!Recv(sizeof(dwSrcGuildID), &dwSrcGuildID)) + return false; + + if (!Recv(sizeof(dwDstGuildID), &dwDstGuildID)) + return false; + + Tracef(" >> GulidWarList [%d vs %d]\n", dwSrcGuildID, dwDstGuildID); + CInstanceBase::InsertGVGKey(dwSrcGuildID, dwDstGuildID); + CPythonCharacterManager::Instance().ChangeGVG(dwSrcGuildID, dwDstGuildID); + iPacketSize -= nItemSize; + } + break; + } + case GUILD_SUBHEADER_GC_GUILD_WAR_END_LIST: + { + DWORD dwSrcGuildID; + DWORD dwDstGuildID; + + int iPacketSize = int(GuildPacket.size) - sizeof(GuildPacket); + int nItemSize = sizeof(dwSrcGuildID) + sizeof(dwDstGuildID); + + assert(iPacketSize%nItemSize==0 && "GUILD_SUBHEADER_GC_GUILD_WAR_END_LIST"); + + for (; iPacketSize > 0;) + { + + if (!Recv(sizeof(dwSrcGuildID), &dwSrcGuildID)) + return false; + + if (!Recv(sizeof(dwDstGuildID), &dwDstGuildID)) + return false; + + Tracef(" >> GulidWarEndList [%d vs %d]\n", dwSrcGuildID, dwDstGuildID); + CInstanceBase::RemoveGVGKey(dwSrcGuildID, dwDstGuildID); + CPythonCharacterManager::Instance().ChangeGVG(dwSrcGuildID, dwDstGuildID); + iPacketSize -= nItemSize; + } + break; + } + case GUILD_SUBHEADER_GC_WAR_POINT: + { + TPacketGuildWarPoint GuildWarPoint; + if (!Recv(sizeof(GuildWarPoint), &GuildWarPoint)) + return false; + + PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], + "BINARY_GuildWar_OnRecvPoint", + Py_BuildValue("(iii)", GuildWarPoint.dwGainGuildID, GuildWarPoint.dwOpponentGuildID, GuildWarPoint.lPoint) + ); + break; + } + case GUILD_SUBHEADER_GC_MONEY_CHANGE: + { + DWORD dwMoney; + if (!Recv(sizeof(dwMoney), &dwMoney)) + return false; + + CPythonGuild::Instance().SetGuildMoney(dwMoney); + + __RefreshGuildWindowInfoPage(); + Tracef(" >> Guild Money Change : %d\n", dwMoney); + break; + } + } + + return true; +} + +// Guild +////////////////////////////////////////////////////////////////////////// + + +///////////////////////////////////////////////////////////////////////// +// Fishing + +bool CPythonNetworkStream::SendFishingPacket(int iRotation) +{ + BYTE byHeader = HEADER_CG_FISHING; + if (!Send(sizeof(byHeader), &byHeader)) + return false; + BYTE byPacketRotation = iRotation / 5; + if (!Send(sizeof(BYTE), &byPacketRotation)) + return false; + + return SendSequence(); +} + +bool CPythonNetworkStream::SendGiveItemPacket(DWORD dwTargetVID, TItemPos ItemPos, int iItemCount) +{ + TPacketCGGiveItem GiveItemPacket; + GiveItemPacket.byHeader = HEADER_CG_GIVE_ITEM; + GiveItemPacket.dwTargetVID = dwTargetVID; + GiveItemPacket.ItemPos = ItemPos; + GiveItemPacket.byItemCount = iItemCount; + + if (!Send(sizeof(GiveItemPacket), &GiveItemPacket)) + return false; + + return SendSequence(); +} + +bool CPythonNetworkStream::RecvFishing() +{ + TPacketGCFishing FishingPacket; + if (!Recv(sizeof(FishingPacket), &FishingPacket)) + return false; + + CInstanceBase * pFishingInstance = NULL; + if (FISHING_SUBHEADER_GC_FISH != FishingPacket.subheader) + { + pFishingInstance = CPythonCharacterManager::Instance().GetInstancePtr(FishingPacket.info); + if (!pFishingInstance) + return true; + } + + switch (FishingPacket.subheader) + { + case FISHING_SUBHEADER_GC_START: + pFishingInstance->StartFishing(float(FishingPacket.dir) * 5.0f); + break; + case FISHING_SUBHEADER_GC_STOP: + if (pFishingInstance->IsFishing()) + pFishingInstance->StopFishing(); + break; + case FISHING_SUBHEADER_GC_REACT: + if (pFishingInstance->IsFishing()) + { + pFishingInstance->SetFishEmoticon(); // Fish Emoticon + pFishingInstance->ReactFishing(); + } + break; + case FISHING_SUBHEADER_GC_SUCCESS: + pFishingInstance->CatchSuccess(); + break; + case FISHING_SUBHEADER_GC_FAIL: + pFishingInstance->CatchFail(); + if (pFishingInstance == CPythonCharacterManager::Instance().GetMainInstancePtr()) + { + PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "OnFishingFailure", Py_BuildValue("()")); + } + break; + case FISHING_SUBHEADER_GC_FISH: + { + DWORD dwFishID = FishingPacket.info; + + if (0 == FishingPacket.info) + { + PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "OnFishingNotifyUnknown", Py_BuildValue("()")); + return true; + } + + CItemData * pItemData; + if (!CItemManager::Instance().GetItemDataPointer(dwFishID, &pItemData)) + return true; + + CInstanceBase * pMainInstance = CPythonCharacterManager::Instance().GetMainInstancePtr(); + if (!pMainInstance) + return true; + + if (pMainInstance->IsFishing()) + { + PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "OnFishingNotify", Py_BuildValue("(is)", CItemData::ITEM_TYPE_FISH == pItemData->GetType(), pItemData->GetName())); + } + else + { + PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "OnFishingSuccess", Py_BuildValue("(is)", CItemData::ITEM_TYPE_FISH == pItemData->GetType(), pItemData->GetName())); + } + break; + } + } + + return true; +} +// Fishing +///////////////////////////////////////////////////////////////////////// + +///////////////////////////////////////////////////////////////////////// +// Dungeon +bool CPythonNetworkStream::RecvDungeon() +{ + TPacketGCDungeon DungeonPacket; + if (!Recv(sizeof(DungeonPacket), &DungeonPacket)) + return false; + + switch (DungeonPacket.subheader) + { + case DUNGEON_SUBHEADER_GC_TIME_ATTACK_START: + { + break; + } + case DUNGEON_SUBHEADER_GC_DESTINATION_POSITION: + { + unsigned long ulx, uly; + if (!Recv(sizeof(ulx), &ulx)) + return false; + if (!Recv(sizeof(uly), &uly)) + return false; + + CPythonPlayer::Instance().SetDungeonDestinationPosition(ulx, uly); + break; + } + } + + return true; +} +// Dungeon +///////////////////////////////////////////////////////////////////////// + +///////////////////////////////////////////////////////////////////////// +// MyShop +bool CPythonNetworkStream::SendBuildPrivateShopPacket(const char * c_szName, const std::vector & c_rSellingItemStock) +{ + TPacketCGMyShop packet; + packet.bHeader = HEADER_CG_MYSHOP; + strncpy(packet.szSign, c_szName, SHOP_SIGN_MAX_LEN); + packet.bCount = static_cast(c_rSellingItemStock.size()); + if (!Send(sizeof(packet), &packet)) + return false; + + for (std::vector::const_iterator itor = c_rSellingItemStock.begin(); itor < c_rSellingItemStock.end(); ++itor) + { + const TShopItemTable & c_rItem = *itor; + if (!Send(sizeof(c_rItem), &c_rItem)) + return false; + } + + return SendSequence(); +} + +bool CPythonNetworkStream::RecvShopSignPacket() +{ + TPacketGCShopSign p; + if (!Recv(sizeof(TPacketGCShopSign), &p)) + return false; + + CPythonPlayer& rkPlayer=CPythonPlayer::Instance(); + + if (0 == strlen(p.szSign)) + { + PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], + "BINARY_PrivateShop_Disappear", + Py_BuildValue("(i)", p.dwVID) + ); + + if (rkPlayer.IsMainCharacterIndex(p.dwVID)) + rkPlayer.ClosePrivateShop(); + } + else + { + PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], + "BINARY_PrivateShop_Appear", + Py_BuildValue("(is)", p.dwVID, p.szSign) + ); + + if (rkPlayer.IsMainCharacterIndex(p.dwVID)) + rkPlayer.OpenPrivateShop(); + } + + return true; +} +///////////////////////////////////////////////////////////////////////// + +bool CPythonNetworkStream::RecvTimePacket() +{ + TPacketGCTime TimePacket; + if (!Recv(sizeof(TimePacket), &TimePacket)) + return false; + + IAbstractApplication& rkApp=IAbstractApplication::GetSingleton(); + rkApp.SetServerTime(TimePacket.time); + + return true; +} + +bool CPythonNetworkStream::RecvWalkModePacket() +{ + TPacketGCWalkMode WalkModePacket; + if (!Recv(sizeof(WalkModePacket), &WalkModePacket)) + return false; + + CInstanceBase * pInstance = CPythonCharacterManager::Instance().GetInstancePtr(WalkModePacket.vid); + if (pInstance) + { + if (WALKMODE_RUN == WalkModePacket.mode) + { + pInstance->SetRunMode(); + } + else + { + pInstance->SetWalkMode(); + } + } + + return true; +} + +bool CPythonNetworkStream::RecvChangeSkillGroupPacket() +{ + TPacketGCChangeSkillGroup ChangeSkillGroup; + if (!Recv(sizeof(ChangeSkillGroup), &ChangeSkillGroup)) + return false; + + m_dwMainActorSkillGroup = ChangeSkillGroup.skill_group; + + CPythonPlayer::Instance().NEW_ClearSkillData(); + __RefreshCharacterWindow(); + return true; +} + +void CPythonNetworkStream::__TEST_SetSkillGroupFake(int iIndex) +{ + m_dwMainActorSkillGroup = DWORD(iIndex); + + CPythonPlayer::Instance().NEW_ClearSkillData(); + PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "RefreshCharacter", Py_BuildValue("()")); +} + +bool CPythonNetworkStream::SendRefinePacket(BYTE byPos, BYTE byType) +{ + TPacketCGRefine kRefinePacket; + kRefinePacket.header = HEADER_CG_REFINE; + kRefinePacket.pos = byPos; + kRefinePacket.type = byType; + + if (!Send(sizeof(kRefinePacket), &kRefinePacket)) + return false; + + return SendSequence(); +} + +bool CPythonNetworkStream::SendSelectItemPacket(DWORD dwItemPos) +{ + TPacketCGScriptSelectItem kScriptSelectItem; + kScriptSelectItem.header = HEADER_CG_SCRIPT_SELECT_ITEM; + kScriptSelectItem.selection = dwItemPos; + + if (!Send(sizeof(kScriptSelectItem), &kScriptSelectItem)) + return false; + + return SendSequence(); +} + +bool CPythonNetworkStream::RecvRefineInformationPacket() +{ + TPacketGCRefineInformation kRefineInfoPacket; + if (!Recv(sizeof(kRefineInfoPacket), &kRefineInfoPacket)) + return false; + + TRefineTable & rkRefineTable = kRefineInfoPacket.refine_table; + PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], + "OpenRefineDialog", + Py_BuildValue("(iiii)", + kRefineInfoPacket.pos, + kRefineInfoPacket.refine_table.result_vnum, + rkRefineTable.cost, + rkRefineTable.prob)); + + for (int i = 0; i < rkRefineTable.material_count; ++i) + { + PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "AppendMaterialToRefineDialog", Py_BuildValue("(ii)", rkRefineTable.materials[i].vnum, rkRefineTable.materials[i].count)); + } + +#ifdef _DEBUG + Tracef(" >> RecvRefineInformationPacket(pos=%d, result_vnum=%d, cost=%d, prob=%d)\n", + kRefineInfoPacket.pos, + kRefineInfoPacket.refine_table.result_vnum, + rkRefineTable.cost, + rkRefineTable.prob); +#endif + + return true; +} + +bool CPythonNetworkStream::RecvRefineInformationPacketNew() +{ + TPacketGCRefineInformationNew kRefineInfoPacket; + if (!Recv(sizeof(kRefineInfoPacket), &kRefineInfoPacket)) + return false; + + TRefineTable & rkRefineTable = kRefineInfoPacket.refine_table; + PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], + "OpenRefineDialog", + Py_BuildValue("(iiiii)", + kRefineInfoPacket.pos, + kRefineInfoPacket.refine_table.result_vnum, + rkRefineTable.cost, + rkRefineTable.prob, + kRefineInfoPacket.type) + ); + + for (int i = 0; i < rkRefineTable.material_count; ++i) + { + PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "AppendMaterialToRefineDialog", Py_BuildValue("(ii)", rkRefineTable.materials[i].vnum, rkRefineTable.materials[i].count)); + } + +#ifdef _DEBUG + Tracef(" >> RecvRefineInformationPacketNew(pos=%d, result_vnum=%d, cost=%d, prob=%d, type=%d)\n", + kRefineInfoPacket.pos, + kRefineInfoPacket.refine_table.result_vnum, + rkRefineTable.cost, + rkRefineTable.prob, + kRefineInfoPacket.type); +#endif + + return true; +} + +bool CPythonNetworkStream::RecvNPCList() +{ + TPacketGCNPCPosition kNPCPosition; + if (!Recv(sizeof(kNPCPosition), &kNPCPosition)) + return false; + + assert(int(kNPCPosition.size)-sizeof(kNPCPosition) == kNPCPosition.count*sizeof(TNPCPosition) && "HEADER_GC_NPC_POSITION"); + + CPythonMiniMap::Instance().ClearAtlasMarkInfo(); + + for (int i = 0; i < kNPCPosition.count; ++i) + { + TNPCPosition NPCPosition; + if (!Recv(sizeof(TNPCPosition), &NPCPosition)) + return false; + + CPythonMiniMap::Instance().RegisterAtlasMark(NPCPosition.bType, NPCPosition.name, NPCPosition.x, NPCPosition.y); + } + + return true; +} + +bool CPythonNetworkStream::__SendCRCReportPacket() +{ + /* + DWORD dwProcessCRC = 0; + DWORD dwFileCRC = 0; + CFilename exeFileName; + //LPCVOID c_pvBaseAddress = NULL; + + GetExeCRC(dwProcessCRC, dwFileCRC); + + CFilename strRootPackFileName = CEterPackManager::Instance().GetRootPacketFileName(); + strRootPackFileName.ChangeDosPath(); + + TPacketCGCRCReport kReportPacket; + + kReportPacket.header = HEADER_CG_CRC_REPORT; + kReportPacket.byPackMode = CEterPackManager::Instance().GetSearchMode(); + kReportPacket.dwBinaryCRC32 = dwFileCRC; + kReportPacket.dwProcessCRC32 = dwProcessCRC; + kReportPacket.dwRootPackCRC32 = GetFileCRC32(strRootPackFileName.c_str()); + + if (!Send(sizeof(kReportPacket), &kReportPacket)) + Tracef("SendClientReportPacket Error"); + + return SendSequence(); + */ + return true; +} + +bool CPythonNetworkStream::SendClientVersionPacket() +{ + std::string filename; + + GetExcutedFileName(filename); + + filename = CFileNameHelper::NoPath(filename); + CFileNameHelper::ChangeDosPath(filename); + + if (LocaleService_IsEUROPE() && false == LocaleService_IsYMIR()) + { + TPacketCGClientVersion2 kVersionPacket; + kVersionPacket.header = HEADER_CG_CLIENT_VERSION2; + strncpy(kVersionPacket.filename, filename.c_str(), sizeof(kVersionPacket.filename)-1); + strncpy(kVersionPacket.timestamp, "1215955205", sizeof(kVersionPacket.timestamp)-1); // # python time.time 앞자리 + //strncpy(kVersionPacket.timestamp, __TIMESTAMP__, sizeof(kVersionPacket.timestamp)-1); // old_string_ver + //strncpy(kVersionPacket.timestamp, "1218055205", sizeof(kVersionPacket.timestamp)-1); // new_future + //strncpy(kVersionPacket.timestamp, "1214055205", sizeof(kVersionPacket.timestamp)-1); // old_past + + if (!Send(sizeof(kVersionPacket), &kVersionPacket)) + Tracef("SendClientReportPacket Error"); + } + else + { + TPacketCGClientVersion kVersionPacket; + kVersionPacket.header = HEADER_CG_CLIENT_VERSION; + strncpy(kVersionPacket.filename, filename.c_str(), sizeof(kVersionPacket.filename)-1); + strncpy(kVersionPacket.timestamp, __TIMESTAMP__, sizeof(kVersionPacket.timestamp)-1); + + if (!Send(sizeof(kVersionPacket), &kVersionPacket)) + Tracef("SendClientReportPacket Error"); + } + return SendSequence(); +} + +bool CPythonNetworkStream::RecvAffectAddPacket() +{ + TPacketGCAffectAdd kAffectAdd; + if (!Recv(sizeof(kAffectAdd), &kAffectAdd)) + return false; + + TPacketAffectElement & rkElement = kAffectAdd.elem; + if (rkElement.bPointIdxApplyOn == POINT_ENERGY) + { + CPythonPlayer::instance().SetStatus (POINT_ENERGY_END_TIME, CPythonApplication::Instance().GetServerTimeStamp() + rkElement.lDuration); + __RefreshStatus(); + } + PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "BINARY_NEW_AddAffect", Py_BuildValue("(iiii)", rkElement.dwType, rkElement.bPointIdxApplyOn, rkElement.lApplyValue, rkElement.lDuration)); + + return true; +} + +bool CPythonNetworkStream::RecvAffectRemovePacket() +{ + TPacketGCAffectRemove kAffectRemove; + if (!Recv(sizeof(kAffectRemove), &kAffectRemove)) + return false; + + PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "BINARY_NEW_RemoveAffect", Py_BuildValue("(ii)", kAffectRemove.dwType, kAffectRemove.bApplyOn)); + + return true; +} + +bool CPythonNetworkStream::RecvChannelPacket() +{ + TPacketGCChannel kChannelPacket; + if (!Recv(sizeof(kChannelPacket), &kChannelPacket)) + return false; + + //Tracef(" >> CPythonNetworkStream::RecvChannelPacket(channel=%d)\n", kChannelPacket.channel); + + return true; +} + +bool CPythonNetworkStream::RecvViewEquipPacket() +{ + TPacketGCViewEquip kViewEquipPacket; + if (!Recv(sizeof(kViewEquipPacket), &kViewEquipPacket)) + return false; + + PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "OpenEquipmentDialog", Py_BuildValue("(i)", kViewEquipPacket.dwVID)); + + for (int i = 0; i < WEAR_MAX_NUM; ++i) + { + TEquipmentItemSet & rItemSet = kViewEquipPacket.equips[i]; + PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "SetEquipmentDialogItem", Py_BuildValue("(iiii)", kViewEquipPacket.dwVID, i, rItemSet.vnum, rItemSet.count)); + + for (int j = 0; j < ITEM_SOCKET_SLOT_MAX_NUM; ++j) + PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "SetEquipmentDialogSocket", Py_BuildValue("(iiii)", kViewEquipPacket.dwVID, i, j, rItemSet.alSockets[j])); + + for (int k = 0; k < ITEM_ATTRIBUTE_SLOT_MAX_NUM; ++k) + PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "SetEquipmentDialogAttr", Py_BuildValue("(iiiii)", kViewEquipPacket.dwVID, i, k, rItemSet.aAttr[k].bType, rItemSet.aAttr[k].sValue)); + } + + return true; +} + +bool CPythonNetworkStream::RecvLandPacket() +{ + TPacketGCLandList kLandList; + if (!Recv(sizeof(kLandList), &kLandList)) + return false; + + std::vector kVec_dwGuildID; + + CPythonMiniMap & rkMiniMap = CPythonMiniMap::Instance(); + CPythonBackground & rkBG = CPythonBackground::Instance(); + CInstanceBase * pMainInstance = CPythonPlayer::Instance().NEW_GetMainActorPtr(); + + rkMiniMap.ClearGuildArea(); + rkBG.ClearGuildArea(); + + int iPacketSize = (kLandList.size - sizeof(TPacketGCLandList)); + for (; iPacketSize > 0; iPacketSize-=sizeof(TLandPacketElement)) + { + TLandPacketElement kElement; + if (!Recv(sizeof(TLandPacketElement), &kElement)) + return false; + + rkMiniMap.RegisterGuildArea(kElement.dwID, + kElement.dwGuildID, + kElement.x, + kElement.y, + kElement.width, + kElement.height); + + if (pMainInstance) + if (kElement.dwGuildID == pMainInstance->GetGuildID()) + { + rkBG.RegisterGuildArea(kElement.x, + kElement.y, + kElement.x+kElement.width, + kElement.y+kElement.height); + } + + if (0 != kElement.dwGuildID) + kVec_dwGuildID.push_back(kElement.dwGuildID); + } + + __DownloadSymbol(kVec_dwGuildID); + + return true; +} + +bool CPythonNetworkStream::RecvTargetCreatePacket() +{ + TPacketGCTargetCreate kTargetCreate; + if (!Recv(sizeof(kTargetCreate), &kTargetCreate)) + return false; + + CPythonMiniMap & rkpyMiniMap = CPythonMiniMap::Instance(); + rkpyMiniMap.CreateTarget(kTargetCreate.lID, kTargetCreate.szTargetName); + +//#ifdef _DEBUG +// char szBuf[256+1]; +// _snprintf(szBuf, sizeof(szBuf), "타겟이 생성 되었습니다 [%d:%s]", kTargetCreate.lID, kTargetCreate.szTargetName); +// CPythonChat::Instance().AppendChat(CHAT_TYPE_NOTICE, szBuf); +// Tracef(" >> RecvTargetCreatePacket %d : %s\n", kTargetCreate.lID, kTargetCreate.szTargetName); +//#endif + + PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "BINARY_OpenAtlasWindow", Py_BuildValue("()")); + return true; +} + +bool CPythonNetworkStream::RecvTargetCreatePacketNew() +{ + TPacketGCTargetCreateNew kTargetCreate; + if (!Recv(sizeof(kTargetCreate), &kTargetCreate)) + return false; + + CPythonMiniMap & rkpyMiniMap = CPythonMiniMap::Instance(); + CPythonBackground & rkpyBG = CPythonBackground::Instance(); + if (CREATE_TARGET_TYPE_LOCATION == kTargetCreate.byType) + { + rkpyMiniMap.CreateTarget(kTargetCreate.lID, kTargetCreate.szTargetName); + } + else + { + rkpyMiniMap.CreateTarget(kTargetCreate.lID, kTargetCreate.szTargetName, kTargetCreate.dwVID); + rkpyBG.CreateTargetEffect(kTargetCreate.lID, kTargetCreate.dwVID); + } + +//#ifdef _DEBUG +// char szBuf[256+1]; +// _snprintf(szBuf, sizeof(szBuf), "캐릭터 타겟이 생성 되었습니다 [%d:%s:%d]", kTargetCreate.lID, kTargetCreate.szTargetName, kTargetCreate.dwVID); +// CPythonChat::Instance().AppendChat(CHAT_TYPE_NOTICE, szBuf); +// Tracef(" >> RecvTargetCreatePacketNew %d : %d/%d\n", kTargetCreate.lID, kTargetCreate.byType, kTargetCreate.dwVID); +//#endif + + PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "BINARY_OpenAtlasWindow", Py_BuildValue("()")); + return true; +} + +bool CPythonNetworkStream::RecvTargetUpdatePacket() +{ + TPacketGCTargetUpdate kTargetUpdate; + if (!Recv(sizeof(kTargetUpdate), &kTargetUpdate)) + return false; + + CPythonMiniMap & rkpyMiniMap = CPythonMiniMap::Instance(); + rkpyMiniMap.UpdateTarget(kTargetUpdate.lID, kTargetUpdate.lX, kTargetUpdate.lY); + + CPythonBackground & rkpyBG = CPythonBackground::Instance(); + rkpyBG.CreateTargetEffect(kTargetUpdate.lID, kTargetUpdate.lX, kTargetUpdate.lY); + +//#ifdef _DEBUG +// char szBuf[256+1]; +// _snprintf(szBuf, sizeof(szBuf), "타겟의 위치가 갱신 되었습니다 [%d:%d/%d]", kTargetUpdate.lID, kTargetUpdate.lX, kTargetUpdate.lY); +// CPythonChat::Instance().AppendChat(CHAT_TYPE_NOTICE, szBuf); +// Tracef(" >> RecvTargetUpdatePacket %d : %d, %d\n", kTargetUpdate.lID, kTargetUpdate.lX, kTargetUpdate.lY); +//#endif + + return true; +} + +bool CPythonNetworkStream::RecvTargetDeletePacket() +{ + TPacketGCTargetDelete kTargetDelete; + if (!Recv(sizeof(kTargetDelete), &kTargetDelete)) + return false; + + CPythonMiniMap & rkpyMiniMap = CPythonMiniMap::Instance(); + rkpyMiniMap.DeleteTarget(kTargetDelete.lID); + + CPythonBackground & rkpyBG = CPythonBackground::Instance(); + rkpyBG.DeleteTargetEffect(kTargetDelete.lID); + +//#ifdef _DEBUG +// Tracef(" >> RecvTargetDeletePacket %d\n", kTargetDelete.lID); +//#endif + + return true; +} + +bool CPythonNetworkStream::RecvLoverInfoPacket() +{ + TPacketGCLoverInfo kLoverInfo; + if (!Recv(sizeof(kLoverInfo), &kLoverInfo)) + return false; + + PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "BINARY_LoverInfo", Py_BuildValue("(si)", kLoverInfo.szName, kLoverInfo.byLovePoint)); +#ifdef _DEBUG + Tracef("RECV LOVER INFO : %s, %d\n", kLoverInfo.szName, kLoverInfo.byLovePoint); +#endif + return true; +} + +bool CPythonNetworkStream::RecvLovePointUpdatePacket() +{ + TPacketGCLovePointUpdate kLovePointUpdate; + if (!Recv(sizeof(kLovePointUpdate), &kLovePointUpdate)) + return false; + + PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "BINARY_UpdateLovePoint", Py_BuildValue("(i)", kLovePointUpdate.byLovePoint)); +#ifdef _DEBUG + Tracef("RECV LOVE POINT UPDATE : %d\n", kLovePointUpdate.byLovePoint); +#endif + return true; +} + +bool CPythonNetworkStream::RecvDigMotionPacket() +{ + TPacketGCDigMotion kDigMotion; + if (!Recv(sizeof(kDigMotion), &kDigMotion)) + return false; + +#ifdef _DEBUG + Tracef(" Dig Motion [%d/%d]\n", kDigMotion.vid, kDigMotion.count); +#endif + + IAbstractCharacterManager& rkChrMgr=IAbstractCharacterManager::GetSingleton(); + CInstanceBase * pkInstMain = rkChrMgr.GetInstancePtr(kDigMotion.vid); + CInstanceBase * pkInstTarget = rkChrMgr.GetInstancePtr(kDigMotion.target_vid); + if (NULL == pkInstMain) + return true; + + if (pkInstTarget) + pkInstMain->NEW_LookAtDestInstance(*pkInstTarget); + + for (int i = 0; i < kDigMotion.count; ++i) + pkInstMain->PushOnceMotion(CRaceMotionData::NAME_DIG); + + return true; +} + + +// 용혼석 강화 +bool CPythonNetworkStream::SendDragonSoulRefinePacket(BYTE bRefineType, TItemPos* pos) +{ + TPacketCGDragonSoulRefine pk; + pk.header = HEADER_CG_DRAGON_SOUL_REFINE; + pk.bSubType = bRefineType; + memcpy (pk.ItemGrid, pos, sizeof (TItemPos) * DS_REFINE_WINDOW_MAX_NUM); + if (!Send(sizeof (pk), &pk)) + { + return false; + } + return true; +} + + +#if defined(ENABLE_DISCORD_RPC) +#include "discord_rpc.h" +#include "Discord.h" +#ifdef _DEBUG +#pragma comment(lib, "discord_rpc_d.lib") +#else +#pragma comment(lib, "discord_rpc_r.lib") +#endif + +static int64_t StartTime = 0; +void CPythonNetworkStream::Discord_Start() +{ + StartTime = time(0); + DiscordEventHandlers handlers; + memset(&handlers, 0, sizeof(handlers)); + Discord_Initialize(Discord::DiscordClientID, &handlers, 1, nullptr); + Discord_Update(false); +} + +void CPythonNetworkStream::Discord_Update(const bool bInGame) +{ + DiscordRichPresence discordPresence; + memset(&discordPresence, 0, sizeof(discordPresence)); + discordPresence.startTimestamp = StartTime; + + if (!bInGame) { + Discord_UpdatePresence(&discordPresence); + return; + } + + /*Name*/ + auto NameData = Discord::GetNameData(); + discordPresence.state = std::get<0>(NameData).c_str(); + discordPresence.details = std::get<1>(NameData).c_str(); + + /*Race*/ + auto RaceData = Discord::GetRaceData(); + discordPresence.largeImageKey = std::get<0>(RaceData).c_str(); + discordPresence.largeImageText = std::get<1>(RaceData).c_str(); + + /*Empire*/ + auto EmpireData = Discord::GetEmpireData(); + discordPresence.smallImageKey = std::get<0>(EmpireData).c_str(); + discordPresence.smallImageText = std::get<1>(EmpireData).c_str(); + + Discord_UpdatePresence(&discordPresence); +} + +void CPythonNetworkStream::Discord_Close() +{ + Discord_Shutdown(); +} +#endif diff --git a/extension/src/port/UserInterface/PythonNetworkStreamPhaseGameActor.cpp b/extension/src/port/UserInterface/PythonNetworkStreamPhaseGameActor.cpp new file mode 100644 index 00000000..21b9f030 --- /dev/null +++ b/extension/src/port/UserInterface/PythonNetworkStreamPhaseGameActor.cpp @@ -0,0 +1,454 @@ +#include "StdAfx.h" +#include "PythonNetworkStream.h" +#include "NetworkActorManager.h" +#include "PythonBackground.h" + +#include "PythonApplication.h" +#include "AbstractPlayer.h" +#include "../GameLib/ActorInstance.h" + + + + + +void CPythonNetworkStream::__GlobalPositionToLocalPosition(LONG& rGlobalX, LONG& rGlobalY) +{ + CPythonBackground&rkBgMgr=CPythonBackground::Instance(); + rkBgMgr.GlobalPositionToLocalPosition(rGlobalX, rGlobalY); +} + +void CPythonNetworkStream::__LocalPositionToGlobalPosition(LONG& rLocalX, LONG& rLocalY) +{ + CPythonBackground&rkBgMgr=CPythonBackground::Instance(); + rkBgMgr.LocalPositionToGlobalPosition(rLocalX, rLocalY); +} + +bool CPythonNetworkStream::__CanActMainInstance() +{ + CPythonCharacterManager& rkChrMgr=CPythonCharacterManager::Instance(); + CInstanceBase* pkInstMain=rkChrMgr.GetMainInstancePtr(); + if (!pkInstMain) + return false; + + return pkInstMain->CanAct(); +} + +void CPythonNetworkStream::__ClearNetworkActorManager() +{ + m_rokNetActorMgr->Destroy(); +} + +void __SetWeaponPower(IAbstractPlayer& rkPlayer, DWORD dwWeaponID) +{ + DWORD minPower=0; + DWORD maxPower=0; + DWORD minMagicPower=0; + DWORD maxMagicPower=0; + DWORD addPower=0; + + CItemData* pkWeapon; + if (CItemManager::Instance().GetItemDataPointer(dwWeaponID, &pkWeapon)) + { + if (pkWeapon->GetType()==CItemData::ITEM_TYPE_WEAPON) + { + minPower=pkWeapon->GetValue(3); + maxPower=pkWeapon->GetValue(4); + minMagicPower=pkWeapon->GetValue(1); + maxMagicPower=pkWeapon->GetValue(2); + addPower=pkWeapon->GetValue(5); + } + } + + rkPlayer.SetWeaponPower(minPower, maxPower, minMagicPower, maxMagicPower, addPower); +} + +//테이블에서 이름이 "." 인 것들 +//차후에 서버에서 보내주지 않게 되면 없어질 함수..(서버님께 꼭!!협박; ) +bool IsInvisibleRace(WORD raceNum) +{ + switch(raceNum) + { + case 20025: + case 20038: + case 20039: + return true; + default: + return false; + } +} + +static SNetworkActorData s_kNetActorData; + + +bool CPythonNetworkStream::RecvCharacterAppendPacket() +{ + TPacketGCCharacterAdd chrAddPacket; + if (!Recv(sizeof(chrAddPacket), &chrAddPacket)) + return false; + + __GlobalPositionToLocalPosition(chrAddPacket.x, chrAddPacket.y); + + SNetworkActorData kNetActorData; + kNetActorData.m_bType=chrAddPacket.bType; + kNetActorData.m_dwMovSpd=chrAddPacket.bMovingSpeed; + kNetActorData.m_dwAtkSpd=chrAddPacket.bAttackSpeed; + kNetActorData.m_dwRace=chrAddPacket.wRaceNum; + + kNetActorData.m_dwStateFlags=chrAddPacket.bStateFlag; + kNetActorData.m_dwVID=chrAddPacket.dwVID; + kNetActorData.m_fRot=chrAddPacket.angle; + + kNetActorData.m_stName=""; + + kNetActorData.m_stName=""; + kNetActorData.m_kAffectFlags.CopyData(0, sizeof(chrAddPacket.dwAffectFlag[0]), &chrAddPacket.dwAffectFlag[0]); + kNetActorData.m_kAffectFlags.CopyData(32, sizeof(chrAddPacket.dwAffectFlag[1]), &chrAddPacket.dwAffectFlag[1]); + + kNetActorData.SetPosition(chrAddPacket.x, chrAddPacket.y); + + kNetActorData.m_sAlignment=0;/*chrAddPacket.sAlignment*/; + kNetActorData.m_byPKMode=0;/*chrAddPacket.bPKMode*/; + kNetActorData.m_dwGuildID=0;/*chrAddPacket.dwGuild*/; + kNetActorData.m_dwEmpireID=0;/*chrAddPacket.bEmpire*/; + kNetActorData.m_dwArmor=0;/*chrAddPacket.awPart[CHR_EQUIPPART_ARMOR]*/; + kNetActorData.m_dwWeapon=0;/*chrAddPacket.awPart[CHR_EQUIPPART_WEAPON]*/; + kNetActorData.m_dwHair=0;/*chrAddPacket.awPart[CHR_EQUIPPART_HAIR]*/; + kNetActorData.m_dwMountVnum=0;/*chrAddPacket.dwMountVnum*/; + + kNetActorData.m_dwLevel = 0; // 몬스터 레벨 표시 안함 + + if(kNetActorData.m_bType != CActorInstance::TYPE_PC && + kNetActorData.m_bType != CActorInstance::TYPE_NPC) + { + const char * c_szName; + CPythonNonPlayer& rkNonPlayer=CPythonNonPlayer::Instance(); + if (rkNonPlayer.GetName(kNetActorData.m_dwRace, &c_szName)) + kNetActorData.m_stName = c_szName; + //else + // kNetActorData.m_stName=chrAddPacket.name; + + __RecvCharacterAppendPacket(&kNetActorData); + } + else + { + s_kNetActorData = kNetActorData; + } + + return true; +} + +bool CPythonNetworkStream::RecvCharacterAdditionalInfo() +{ + TPacketGCCharacterAdditionalInfo chrInfoPacket; + if (!Recv(sizeof(chrInfoPacket), &chrInfoPacket)) + return false; + + + SNetworkActorData kNetActorData = s_kNetActorData; + if (IsInvisibleRace(kNetActorData.m_dwRace)) + return true; + + if(kNetActorData.m_dwVID == chrInfoPacket.dwVID) + { + kNetActorData.m_stName = chrInfoPacket.name; + kNetActorData.m_dwGuildID = chrInfoPacket.dwGuildID; + kNetActorData.m_dwLevel = chrInfoPacket.dwLevel; + kNetActorData.m_sAlignment=chrInfoPacket.sAlignment; + kNetActorData.m_byPKMode=chrInfoPacket.bPKMode; + kNetActorData.m_dwGuildID=chrInfoPacket.dwGuildID; + kNetActorData.m_dwEmpireID=chrInfoPacket.bEmpire; + kNetActorData.m_dwArmor=chrInfoPacket.awPart[CHR_EQUIPPART_ARMOR]; + kNetActorData.m_dwWeapon=chrInfoPacket.awPart[CHR_EQUIPPART_WEAPON]; + kNetActorData.m_dwHair=chrInfoPacket.awPart[CHR_EQUIPPART_HAIR]; + kNetActorData.m_dwMountVnum=chrInfoPacket.dwMountVnum; + + __RecvCharacterAppendPacket(&kNetActorData); + } + else + { + TraceError("TPacketGCCharacterAdditionalInfo name=%s vid=%d race=%d Error",chrInfoPacket.name,chrInfoPacket.dwVID,kNetActorData.m_dwRace); + } + return true; +} + +bool CPythonNetworkStream::RecvCharacterAppendPacketNew() +{ + TraceError("TPacketGCCharacterAdd2\264\302 \276\262\301\366 \276\312\264\302 \306\320\305\266\300\324\264\317\264\331."); + TPacketGCCharacterAdd2 chrAddPacket; + if (!Recv(sizeof(chrAddPacket), &chrAddPacket)) + return false; + if(IsInvisibleRace(chrAddPacket.wRaceNum)) + return true; + + __GlobalPositionToLocalPosition(chrAddPacket.x, chrAddPacket.y); + + SNetworkActorData kNetActorData; + kNetActorData.m_dwLevel = 0; + kNetActorData.m_bType=chrAddPacket.bType; + kNetActorData.m_dwGuildID=chrAddPacket.dwGuild; + kNetActorData.m_dwEmpireID=chrAddPacket.bEmpire; + kNetActorData.m_dwMovSpd=chrAddPacket.bMovingSpeed; + kNetActorData.m_dwAtkSpd=chrAddPacket.bAttackSpeed; + kNetActorData.m_dwRace=chrAddPacket.wRaceNum; + kNetActorData.m_dwArmor=chrAddPacket.awPart[CHR_EQUIPPART_ARMOR]; + kNetActorData.m_dwWeapon=chrAddPacket.awPart[CHR_EQUIPPART_WEAPON]; + kNetActorData.m_dwHair=chrAddPacket.awPart[CHR_EQUIPPART_HAIR]; + kNetActorData.m_dwStateFlags=chrAddPacket.bStateFlag; + kNetActorData.m_dwVID=chrAddPacket.dwVID; + kNetActorData.m_dwMountVnum=chrAddPacket.dwMountVnum; + kNetActorData.m_fRot=chrAddPacket.angle; + kNetActorData.m_kAffectFlags.CopyData(0, sizeof(chrAddPacket.dwAffectFlag[0]), &chrAddPacket.dwAffectFlag[0]); + kNetActorData.m_kAffectFlags.CopyData(32, sizeof(chrAddPacket.dwAffectFlag[1]), &chrAddPacket.dwAffectFlag[1]); + kNetActorData.SetPosition(chrAddPacket.x, chrAddPacket.y); + kNetActorData.m_sAlignment=chrAddPacket.sAlignment; + kNetActorData.m_byPKMode=chrAddPacket.bPKMode; + kNetActorData.m_stName=chrAddPacket.name; + __RecvCharacterAppendPacket(&kNetActorData); + + return true; +} + +bool CPythonNetworkStream::RecvCharacterUpdatePacket() +{ + TPacketGCCharacterUpdate chrUpdatePacket; + if (!Recv(sizeof(chrUpdatePacket), &chrUpdatePacket)) + return false; + + SNetworkUpdateActorData kNetUpdateActorData; + kNetUpdateActorData.m_dwGuildID=chrUpdatePacket.dwGuildID; + kNetUpdateActorData.m_dwMovSpd=chrUpdatePacket.bMovingSpeed; + kNetUpdateActorData.m_dwAtkSpd=chrUpdatePacket.bAttackSpeed; + kNetUpdateActorData.m_dwArmor=chrUpdatePacket.awPart[CHR_EQUIPPART_ARMOR]; + kNetUpdateActorData.m_dwWeapon=chrUpdatePacket.awPart[CHR_EQUIPPART_WEAPON]; + kNetUpdateActorData.m_dwHair=chrUpdatePacket.awPart[CHR_EQUIPPART_HAIR]; + kNetUpdateActorData.m_dwVID=chrUpdatePacket.dwVID; + kNetUpdateActorData.m_kAffectFlags.CopyData(0, sizeof(chrUpdatePacket.dwAffectFlag[0]), &chrUpdatePacket.dwAffectFlag[0]); + kNetUpdateActorData.m_kAffectFlags.CopyData(32, sizeof(chrUpdatePacket.dwAffectFlag[1]), &chrUpdatePacket.dwAffectFlag[1]); + kNetUpdateActorData.m_sAlignment=chrUpdatePacket.sAlignment; + kNetUpdateActorData.m_byPKMode=chrUpdatePacket.bPKMode; + kNetUpdateActorData.m_dwStateFlags=chrUpdatePacket.bStateFlag; + kNetUpdateActorData.m_dwMountVnum=chrUpdatePacket.dwMountVnum; + __RecvCharacterUpdatePacket(&kNetUpdateActorData); + + return true; +} + +bool CPythonNetworkStream::RecvCharacterUpdatePacketNew() +{ + TPacketGCCharacterUpdate2 chrUpdatePacket; + if (!Recv(sizeof(chrUpdatePacket), &chrUpdatePacket)) + return false; + + SNetworkUpdateActorData kNetUpdateActorData; + kNetUpdateActorData.m_dwGuildID=chrUpdatePacket.dwGuildID; + kNetUpdateActorData.m_dwMovSpd=chrUpdatePacket.bMovingSpeed; + kNetUpdateActorData.m_dwAtkSpd=chrUpdatePacket.bAttackSpeed; + kNetUpdateActorData.m_dwArmor=chrUpdatePacket.awPart[CHR_EQUIPPART_ARMOR]; + kNetUpdateActorData.m_dwWeapon=chrUpdatePacket.awPart[CHR_EQUIPPART_WEAPON]; + kNetUpdateActorData.m_dwHair=chrUpdatePacket.awPart[CHR_EQUIPPART_HAIR]; + kNetUpdateActorData.m_dwVID=chrUpdatePacket.dwVID; + kNetUpdateActorData.m_kAffectFlags.CopyData(0, sizeof(chrUpdatePacket.dwAffectFlag[0]), &chrUpdatePacket.dwAffectFlag[0]); + kNetUpdateActorData.m_kAffectFlags.CopyData(32, sizeof(chrUpdatePacket.dwAffectFlag[1]), &chrUpdatePacket.dwAffectFlag[1]); + kNetUpdateActorData.m_sAlignment=chrUpdatePacket.sAlignment; + kNetUpdateActorData.m_byPKMode=chrUpdatePacket.bPKMode; + kNetUpdateActorData.m_dwStateFlags=chrUpdatePacket.bStateFlag; + kNetUpdateActorData.m_dwMountVnum=chrUpdatePacket.dwMountVnum; + __RecvCharacterUpdatePacket(&kNetUpdateActorData); + + return true; +} + +void CPythonNetworkStream::__RecvCharacterAppendPacket(SNetworkActorData * pkNetActorData) +{ + // NOTE : 카메라가 땅에 묻히는 문제의 해결을 위해 메인 캐릭터가 지형에 올려지기 + // 전에 맵을 업데이트 해 높이를 구할 수 있도록 해놓아야 합니다. + // 단, 게임이 들어갈때가 아닌 이미 캐릭터가 추가 된 이후에만 합니다. + // 헌데 이동인데 왜 Move로 안하고 Append로 하는지..? - [levites] + IAbstractPlayer& rkPlayer = IAbstractPlayer::GetSingleton(); + if (rkPlayer.IsMainCharacterIndex(pkNetActorData->m_dwVID)) + { + rkPlayer.SetRace(pkNetActorData->m_dwRace); + + __SetWeaponPower(rkPlayer, pkNetActorData->m_dwWeapon); + + if (rkPlayer.NEW_GetMainActorPtr()) + { + CPythonBackground::Instance().Update(pkNetActorData->m_lCurX, pkNetActorData->m_lCurY, 0.0f); + CPythonCharacterManager::Instance().Update(); + + // NOTE : 사귀 타워일 경우 GOTO 로 이동시에도 맵 이름을 출력하도록 처리 + { + std::string strMapName = CPythonBackground::Instance().GetWarpMapName(); + if (strMapName == "metin2_map_deviltower1") + __ShowMapName(pkNetActorData->m_lCurX, pkNetActorData->m_lCurY); + } + } + else + { + __ShowMapName(pkNetActorData->m_lCurX, pkNetActorData->m_lCurY); + } + } + + m_rokNetActorMgr->AppendActor(*pkNetActorData); + + if (GetMainActorVID()==pkNetActorData->m_dwVID) + { + rkPlayer.SetTarget(0); + if (m_bComboSkillFlag) + rkPlayer.SetComboSkillFlag(m_bComboSkillFlag); + + __SetGuildID(pkNetActorData->m_dwGuildID); + //CPythonApplication::Instance().SkipRenderBuffering(10000); + } +} + +void CPythonNetworkStream::__RecvCharacterUpdatePacket(SNetworkUpdateActorData * pkNetUpdateActorData) +{ + m_rokNetActorMgr->UpdateActor(*pkNetUpdateActorData); + + IAbstractPlayer& rkPlayer = IAbstractPlayer::GetSingleton(); + if (rkPlayer.IsMainCharacterIndex(pkNetUpdateActorData->m_dwVID)) + { + __SetGuildID(pkNetUpdateActorData->m_dwGuildID); + __SetWeaponPower(rkPlayer, pkNetUpdateActorData->m_dwWeapon); + + __RefreshStatus(); + __RefreshAlignmentWindow(); + __RefreshEquipmentWindow(); + __RefreshInventoryWindow(); + } + else + { + rkPlayer.NotifyCharacterUpdate(pkNetUpdateActorData->m_dwVID); + } +} + +bool CPythonNetworkStream::RecvCharacterDeletePacket() +{ + TPacketGCCharacterDelete chrDelPacket; + + if (!Recv(sizeof(chrDelPacket), &chrDelPacket)) + { + TraceError("CPythonNetworkStream::RecvCharacterDeletePacket - Recv Error"); + return false; + } + + m_rokNetActorMgr->RemoveActor(chrDelPacket.dwVID); + + // 캐릭터가 사라질때 개인 상점도 없애줍니다. + // Key Check 를 하기때문에 없어도 상관은 없습니다. + PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], + "BINARY_PrivateShop_Disappear", + Py_BuildValue("(i)", chrDelPacket.dwVID) + ); + + return true; +} + + +bool CPythonNetworkStream::RecvCharacterMovePacket() +{ + TPacketGCMove kMovePacket; + if (!Recv(sizeof(TPacketGCMove), &kMovePacket)) + { + Tracen("CPythonNetworkStream::RecvCharacterMovePacket - PACKET READ ERROR"); + return false; + } + + __GlobalPositionToLocalPosition(kMovePacket.lX, kMovePacket.lY); + + SNetworkMoveActorData kNetMoveActorData; + kNetMoveActorData.m_dwArg=kMovePacket.bArg; + kNetMoveActorData.m_dwFunc=kMovePacket.bFunc; + kNetMoveActorData.m_dwTime=kMovePacket.dwTime; + kNetMoveActorData.m_dwVID=kMovePacket.dwVID; + kNetMoveActorData.m_fRot=kMovePacket.bRot*5.0f; + kNetMoveActorData.m_lPosX=kMovePacket.lX; + kNetMoveActorData.m_lPosY=kMovePacket.lY; + kNetMoveActorData.m_dwDuration=kMovePacket.dwDuration; + + m_rokNetActorMgr->MoveActor(kNetMoveActorData); + + return true; +} + +bool CPythonNetworkStream::RecvOwnerShipPacket() +{ + TPacketGCOwnership kPacketOwnership; + + if (!Recv(sizeof(kPacketOwnership), &kPacketOwnership)) + return false; + + m_rokNetActorMgr->SetActorOwner(kPacketOwnership.dwOwnerVID, kPacketOwnership.dwVictimVID); + + return true; +} + +bool CPythonNetworkStream::RecvSyncPositionPacket() +{ + TPacketGCSyncPosition kPacketSyncPos; + if (!Recv(sizeof(kPacketSyncPos), &kPacketSyncPos)) + return false; + + TPacketGCSyncPositionElement kSyncPos; + + UINT uSyncPosCount=(kPacketSyncPos.wSize-sizeof(kPacketSyncPos))/sizeof(kSyncPos); + for (UINT iSyncPos=0; iSyncPosSyncActor(kSyncPos.dwVID, kSyncPos.lX, kSyncPos.lY); + + /* + CPythonCharacterManager & rkChrMgr = CPythonCharacterManager::Instance(); + CInstanceBase * pkChrInst = rkChrMgr.GetInstancePtr(kSyncPos.dwVID); + + if (pkChrInst) + { + pkChrInst->NEW_SyncPixelPosition(kSyncPos.lX, kSyncPos.lY); + } + */ +} + + return true; +} + + +/* +bool CPythonNetworkStream::RecvCharacterAppendPacket() +{ + TPacketGCCharacterAdd chrAddPacket; + + if (!Recv(sizeof(chrAddPacket), &chrAddPacket)) + return false; + + __GlobalPositionToLocalPosition(chrAddPacket.lX, chrAddPacket.lY); + + SNetworkActorData kNetActorData; + kNetActorData.m_dwGuildID=chrAddPacket.dwGuild; + kNetActorData.m_dwEmpireID=chrAddPacket.bEmpire; + kNetActorData.m_dwMovSpd=chrAddPacket.bMovingSpeed; + kNetActorData.m_dwAtkSpd=chrAddPacket.bAttackSpeed; + kNetActorData.m_dwRace=chrAddPacket.wRaceNum; + kNetActorData.m_dwShape=chrAddPacket.parts[CRaceData::PART_MAIN]; + kNetActorData.m_dwStateFlags=chrAddPacket.bStateFlag; + kNetActorData.m_dwVID=chrAddPacket.dwVID; + kNetActorData.m_dwWeapon=chrAddPacket.parts[CRaceData::PART_WEAPON]; + kNetActorData.m_fRot=chrAddPacket.angle; + kNetActorData.m_kAffectFlags.CopyData(0, sizeof(chrAddPacket.dwAffectFlag[0]), &chrAddPacket.dwAffectFlag[0]); + kNetActorData.m_kAffectFlags.CopyData(32, sizeof(chrAddPacket.dwAffectFlag[1]), &chrAddPacket.dwAffectFlag[1]); + kNetActorData.SetPosition(chrAddPacket.lX, chrAddPacket.lY); + kNetActorData.m_stName=chrAddPacket.name; + __RecvCharacterAppendPacket(&kNetActorData); + return true; +} +*/ + diff --git a/extension/src/port/UserInterface/PythonNetworkStreamPhaseGameItem.cpp b/extension/src/port/UserInterface/PythonNetworkStreamPhaseGameItem.cpp new file mode 100644 index 00000000..83cb0aea --- /dev/null +++ b/extension/src/port/UserInterface/PythonNetworkStreamPhaseGameItem.cpp @@ -0,0 +1,940 @@ +#include "StdAfx.h" +#include "PythonNetworkStream.h" +#include "PythonItem.h" +#include "PythonShop.h" +#include "PythonExchange.h" +#include "PythonSafeBox.h" +#include "PythonCharacterManager.h" + +#include "AbstractPlayer.h" + +////////////////////////////////////////////////////////////////////////// +// SafeBox + +bool CPythonNetworkStream::SendSafeBoxMoneyPacket(BYTE byState, DWORD dwMoney) +{ + assert(!"CPythonNetworkStream::SendSafeBoxMoneyPacket - \273\347\277\353\307\317\301\366 \276\312\264\302 \307\324\274\366"); + return false; + +// TPacketCGSafeboxMoney kSafeboxMoney; +// kSafeboxMoney.bHeader = HEADER_CG_SAFEBOX_MONEY; +// kSafeboxMoney.bState = byState; +// kSafeboxMoney.dwMoney = dwMoney; +// if (!Send(sizeof(kSafeboxMoney), &kSafeboxMoney)) +// return false; +// +// return SendSequence(); +} + +bool CPythonNetworkStream::SendSafeBoxCheckinPacket(TItemPos InventoryPos, BYTE bySafeBoxPos) +{ + __PlayInventoryItemDropSound(InventoryPos); + + TPacketCGSafeboxCheckin kSafeboxCheckin; + kSafeboxCheckin.bHeader = HEADER_CG_SAFEBOX_CHECKIN; + kSafeboxCheckin.ItemPos = InventoryPos; + kSafeboxCheckin.bSafePos = bySafeBoxPos; + if (!Send(sizeof(kSafeboxCheckin), &kSafeboxCheckin)) + return false; + + return SendSequence(); +} + +bool CPythonNetworkStream::SendSafeBoxCheckoutPacket(BYTE bySafeBoxPos, TItemPos InventoryPos) +{ + __PlaySafeBoxItemDropSound(bySafeBoxPos); + + TPacketCGSafeboxCheckout kSafeboxCheckout; + kSafeboxCheckout.bHeader = HEADER_CG_SAFEBOX_CHECKOUT; + kSafeboxCheckout.bSafePos = bySafeBoxPos; + kSafeboxCheckout.ItemPos = InventoryPos; + if (!Send(sizeof(kSafeboxCheckout), &kSafeboxCheckout)) + return false; + + return SendSequence(); +} + +bool CPythonNetworkStream::SendSafeBoxItemMovePacket(BYTE bySourcePos, BYTE byTargetPos, BYTE byCount) +{ + __PlaySafeBoxItemDropSound(bySourcePos); + + TPacketCGItemMove kItemMove; + kItemMove.header = HEADER_CG_SAFEBOX_ITEM_MOVE; + kItemMove.pos = TItemPos(INVENTORY, bySourcePos); + kItemMove.num = byCount; + kItemMove.change_pos = TItemPos(INVENTORY, byTargetPos); + if (!Send(sizeof(kItemMove), &kItemMove)) + return false; + + return SendSequence(); +} + +bool CPythonNetworkStream::RecvSafeBoxSetPacket() +{ + TPacketGCItemSet2 kItemSet; + if (!Recv(sizeof(kItemSet), &kItemSet)) + return false; + + TItemData kItemData; + kItemData.vnum = kItemSet.vnum; + kItemData.count = kItemSet.count; + kItemData.flags = kItemSet.flags; + kItemData.anti_flags = kItemSet.anti_flags; + for (int isocket=0; isocket> CPythonNetworkStream::RecvMallItemDelPacket\n"); + + return true; +} +// Mall +////////////////////////////////////////////////////////////////////////// + +// Item +// Recieve +bool CPythonNetworkStream::RecvItemSetPacket() +{ + TPacketGCItemSet packet_item_set; + + if (!Recv(sizeof(TPacketGCItemSet), &packet_item_set)) + return false; + + TItemData kItemData; + kItemData.vnum = packet_item_set.vnum; + kItemData.count = packet_item_set.count; + kItemData.flags = 0; + for (int i=0; iAttachSpecialEffect(effect); + else + pInstance->CreateSpecialEffect(effect); + } + } + + return true; +} + + +bool CPythonNetworkStream::RecvSpecificEffect() +{ + TPacketGCSpecificEffect kSpecificEffect; + if (!Recv(sizeof(kSpecificEffect), &kSpecificEffect)) + return false; + + CInstanceBase * pInstance = CPythonCharacterManager::Instance().GetInstancePtr(kSpecificEffect.vid); + //EFFECT_TEMP + if (pInstance) + { + CInstanceBase::RegisterEffect(CInstanceBase::EFFECT_TEMP, "", kSpecificEffect.effect_file, false); + pInstance->AttachSpecialEffect(CInstanceBase::EFFECT_TEMP); + } + + return true; +} + +bool CPythonNetworkStream::RecvDragonSoulRefine() +{ + TPacketGCDragonSoulRefine kDragonSoul; + + if (!Recv(sizeof(kDragonSoul), &kDragonSoul)) + return false; + + + switch (kDragonSoul.bSubType) + { + case DS_SUB_HEADER_OPEN: + PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "BINARY_DragonSoulRefineWindow_Open", Py_BuildValue("()")); + break; + case DS_SUB_HEADER_REFINE_FAIL: + case DS_SUB_HEADER_REFINE_FAIL_MAX_REFINE: + case DS_SUB_HEADER_REFINE_FAIL_INVALID_MATERIAL: + case DS_SUB_HEADER_REFINE_FAIL_NOT_ENOUGH_MONEY: + case DS_SUB_HEADER_REFINE_FAIL_NOT_ENOUGH_MATERIAL: + case DS_SUB_HEADER_REFINE_FAIL_TOO_MUCH_MATERIAL: + PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "BINARY_DragonSoulRefineWindow_RefineFail", Py_BuildValue("(iii)", + kDragonSoul.bSubType, kDragonSoul.Pos.window_type, kDragonSoul.Pos.cell)); + break; + case DS_SUB_HEADER_REFINE_SUCCEED: + PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "BINARY_DragonSoulRefineWindow_RefineSucceed", + Py_BuildValue("(ii)", kDragonSoul.Pos.window_type, kDragonSoul.Pos.cell)); + break; + } + + return true; +} diff --git a/extension/src/port/UserInterface/StdAfx.h b/extension/src/port/UserInterface/StdAfx.h index df9a9b1f..8d5c0cd5 100644 --- a/extension/src/port/UserInterface/StdAfx.h +++ b/extension/src/port/UserInterface/StdAfx.h @@ -44,4 +44,5 @@ enum // Listed here as 40250 lists them; only the ported ones are defined. void initpack(); void initapp(); +void initChat(); void initnet(); diff --git a/extension/src/port/common/D3D8Types.h b/extension/src/port/common/D3D8Types.h index 53b0eba9..13c3e6a5 100644 --- a/extension/src/port/common/D3D8Types.h +++ b/extension/src/port/common/D3D8Types.h @@ -302,6 +302,16 @@ typedef enum _D3DTEXTURESTAGESTATETYPE D3DTSS_FORCE_DWORD = 0x7fffffff, } D3DTEXTURESTAGESTATETYPE; +// D3D8 texture-stage arguments and operations used by the character renderer. +enum : DWORD { + D3DTA_DIFFUSE = 0, + D3DTA_CURRENT = 1, + D3DTA_TEXTURE = 2, + D3DTOP_DISABLE = 1, + D3DTOP_SELECTARG1 = 2, + D3DTOP_MODULATE = 4, +}; + #define D3DTS_WORLDMATRIX(index) (D3DTRANSFORMSTATETYPE)(index + 256) #define D3DTS_WORLD D3DTS_WORLDMATRIX(0) #define D3DTS_WORLD1 D3DTS_WORLDMATRIX(1) diff --git a/extension/src/port/common/Win32Crt.h b/extension/src/port/common/Win32Crt.h index bd2b6fdb..943840db 100644 --- a/extension/src/port/common/Win32Crt.h +++ b/extension/src/port/common/Win32Crt.h @@ -38,6 +38,7 @@ inline int _strnicmp(const char* a, const char* b, size_t n) { return strncasecm inline int strnicmp(const char* a, const char* b, size_t n) { return strncasecmp(a, b, n); } inline int _strcmpi(const char* a, const char* b) { return strcasecmp(a, b); } +inline int strcmpi(const char* a, const char* b) { return strcasecmp(a, b); } char* _strlwr(char* s); char* _strupr(char* s); diff --git a/extension/tests/port_login_flow_server.cpp b/extension/tests/port_login_flow_server.cpp index 90b05946..6e115700 100644 --- a/extension/tests/port_login_flow_server.cpp +++ b/extension/tests/port_login_flow_server.cpp @@ -440,6 +440,72 @@ bool FakeLoginServer::ServeGame(Connection& c, int index) return Fail(name + ": CG_ENTERGAME: " + error); Event(name + ":entergame"); + // CInputLogin::Entergame order: ch->Show inserts the main actor while the client is still in + // the loading phase (CHARACTER::EncodeInsertPacket = ADD + ADDITIONAL_INFO, then UpdatePacket), + // then SendNPCPosition, PHASE_GAME, SendLandList, TIME, CHANNEL and the greet notice. + GCCharacterAdd actor = zeroed(); + actor.header = HDR_GC_CHARACTER_ADD; + actor.vid = kMainVID; + actor.x = kX; + actor.y = kY; + actor.type = 0; // CHAR_TYPE_PC + actor.race = 0; // warrior male + actor.moving_speed = 100; + actor.attack_speed = 100; + GCCharAddInfo info = zeroed(); + info.header = HDR_GC_CHAR_ADDITIONAL_INFO; + info.vid = kMainVID; + std::strncpy(info.name, kCharacterName, sizeof(info.name) - 1); + info.empire = 1; + info.level = 10; + GCCharacterUpdate update = zeroed(); + update.header = HDR_GC_CHARACTER_UPDATE; + update.vid = kMainVID; + update.moving_speed = 100; + update.attack_speed = 100; + if (!c.Send(actor) || !c.Send(info) || !c.Send(update)) + return Fail(name + ": send main actor"); + + // packet_npc_position = DynHead + count, then TNPCPosition entries. + NPCPosition34 npc = zeroed(); + npc.type = 1; // CHAR_TYPE_NPC + std::strncpy(npc.name, "Npc", sizeof(npc.name) - 1); + npc.x = kX + 500; + npc.y = kY + 500; + DynHead npc_head = {HDR_GC_NPC_POSITION, static_cast(sizeof(DynHead) + sizeof(GCNPCPositionHead) + sizeof(npc))}; + GCNPCPositionHead npc_count = {1}; + if (!c.Send(npc_head) || !c.Send(npc_count) || !c.Send(npc)) + return Fail(name + ": send NPC positions"); + + if (!c.Phase(PHASE_GAME)) + return Fail(name + ": send PHASE_GAME"); + + LandPacketElement24 land = zeroed(); + land.id = 1; + land.x = kX + 1000; + land.y = kY + 1000; + land.width = 2000; + land.height = 2000; + DynHead land_head = {HDR_GC_LAND_LIST, static_cast(sizeof(DynHead) + sizeof(land))}; + GCTime game_time = {HDR_GC_TIME, static_cast(now_ms())}; + GCChannel channel = {HDR_GC_CHANNEL, 1}; + if (!c.Send(land_head) || !c.Send(land) || !c.Send(game_time) || !c.Send(channel)) + return Fail(name + ": send land/time/channel"); + + // SendGreetMessage: a CHAT_TYPE_NOTICE line with no speaker. + const char greet[] = "Welcome"; + GCChatHead chat = {HDR_GC_CHAT, static_cast(sizeof(GCChatHead) + sizeof(greet)), 2 /* CHAT_TYPE_NOTICE */, 0, 1}; + if (!c.Send(chat) || !c.Send(greet, sizeof(greet))) + return Fail(name + ": send greet notice"); + Event(name + ":burst_sent"); + + // A ping after the burst proves that GamePhase consumed every packet above and can reply. + Blank ping = {HDR_GC_PING}; + Blank pong = {}; + if (!c.Send(ping) || read_packet(c, HDR_CG_PONG, &pong, sizeof(pong), &error) != 1) + return Fail(name + ": CG_PONG after the entergame burst: " + error); + Event(name + ":burst_pong"); + // Hold the connection until the test stops us. std::uint8_t byte = 0; while (!m_stop && c.Read(&byte, 1) == 1) diff --git a/extension/tests/port_login_flow_test.cpp b/extension/tests/port_login_flow_test.cpp index 283531b8..140931fd 100644 --- a/extension/tests/port_login_flow_test.cpp +++ b/extension/tests/port_login_flow_test.cpp @@ -15,7 +15,9 @@ // 5. PHASE_LOADING, GC_MAIN_CHARACTER, GC_CHARACTER_POINTS: the loading phase answers the main // character with CG_CLIENT_VERSION(2), the server's proof the client reached Loading; // 6. (批次 2V2) the loading steps end in net.StartGame(): networkModule.SetGamePhase opens -// game.GameWindow, whose Open sends CG_ENTERGAME. +// game.GameWindow, whose Open sends CG_ENTERGAME; +// 7. the server's Entergame answer (the actor's insert packets, PHASE_GAME, the Entergame burst) is +// read by the ported GamePhase without an unknown packet, and a final ping gets its pong. // // The server checks every sequence byte against the 40250 table, so a skipped or extra sequenced // packet fails the run. @@ -25,7 +27,8 @@ // With `live` (批次 2V1-e, ctest port.login_live) the same path runs against a real 40250 server and // the client's own state is the proof: the character list arrived, the loading window got // LoadData from GC_MAIN_CHARACTER, which CPythonNetworkStream::RecvMainCharacter answers with -// CG_CLIENT_VERSION, and game.GameWindow is open, which sent CG_ENTERGAME. Everything about the +// CG_CLIENT_VERSION, game.GameWindow is open, which sent CG_ENTERGAME, and 10 s of the real game +// phase later it is still open and connected with no unknown packet. Everything about the // server comes from the environment and nothing of it is printed: // // MT_LIVE_HOST, MT_LIVE_LOGIN, MT_LIVE_PASSWORD required; without them the test is skipped @@ -36,6 +39,7 @@ #include "../src/platform/ScriptLib/PythonBoot.h" #include "../src/platform/ScriptLib/PythonHost.h" #include "../src/platform/UserInterface/UserInterface.h" +#include "../src/platform/EterBase/TraceErrorObserver.h" #include "port_login_flow_server.h" #include @@ -44,6 +48,7 @@ #include #include #include +#include #include #include #include @@ -59,6 +64,25 @@ static int g_failures = 0; } \ } while (0) +// TraceError lines; the script thread writes them while the host thread waits for its baton. +static std::mutex g_syserr_mutex; +static std::vector g_syserr; + +static void on_trace_error(const char* line) +{ + std::lock_guard lock(g_syserr_mutex); + g_syserr.emplace_back(line); +} + +static int count_syserr(const char* needle) +{ + std::lock_guard lock(g_syserr_mutex); + int n = 0; + for (const auto& line : g_syserr) + n += line.find(needle) != std::string::npos; + return n; +} + static bool py(const std::string& source) { std::string error; @@ -162,6 +186,7 @@ int main(int argc, char** argv) } auto failed = [&] { return server && server->Failed(); }; + SetTraceErrorObserver(on_trace_error); PackSingletons(); CHECK(PackInitialize("pack")); @@ -239,12 +264,29 @@ int main(int argc, char** argv) return failed() || (py_true(gaming) && (!server || server->Has("game2:entergame"))); }); CHECK(entered && !failed()); + + // 7. (批次 2V2-b) The server answers CG_ENTERGAME with the character's own insert packets and + // PHASE_GAME, then the Entergame burst (PVP/land list, time, channel, greet chat, ...). GamePhase + // has to read all of it: an unknown or mis-sized packet makes CheckPacket log "Unknown packet + // header" and drop the receive buffer. Offline the fake server ends with a ping the client + // must answer; live the stream has to stay in the game window and connected for 10 s. + const bool burst = pump_until(live ? 10 : 30, [&] { + return failed() || (server && server->Has("game2:burst_pong")); + }); + CHECK(live || (burst && !failed())); + CHECK(py_true(gaming)); + CHECK(py("import net\nassert net.IsConnect(), 'disconnected in the game phase'")); + CHECK(count_syserr("Unknown packet header") == 0); + // The fake greet notice went through RecvChatPacket into the ported CPythonChat, where + // uichat's chat set (created by the game interface) counts it. + CHECK(live || py("import chat\nassert any(chat.GetLineCount(i) > 0 for i in range(4)), 'greet notice not in chat'")); } if (server) { const std::vector expected = { "auth:handshake", "auth:login3", "game1:handshake", "game1:login2", "auth:closed", "game1:closed", "game2:handshake", "game2:login2", "game2:select", "game2:client_version", "game2:entergame", + "game2:burst_sent", "game2:burst_pong", }; auto events = server->Events(); // auth:closed races game1's handshake; compare the order within each connection.