Decompile 7 functions in Source/Client/Mode/GameMode.cpp, Source/Client/Mode/CGameMode.h
Batch #5885 by Yommy: 2 byte-identical, 5 confirmed by peer review. - fn_21279 CGameMode::GetSkillAttackRange: logic confirmed by peer review - fn_21280 CGameMode::TerrainHeight: byte-identical - fn_21281 CGameMode::TerrainWidth: byte-identical - fn_21283 CGameMode::LocationText: logic confirmed by peer review - fn_21284 CGameMode::HasInventoryItem: logic confirmed by peer review - fn_21285 CGameMode::HasResurrectionItem: logic confirmed by peer review - fn_21287 CGameMode::SendMousePointerState: logic confirmed by peer review Peer-reviewed-by: kyoshi, Romain, Snow, Qwenkler3.8, SapitoSucio Accepted without human review: peers confirmed the logic ("same" ahead by at least 3, with 70% of the votes).
This commit is contained in:
parent
e920abf325
commit
500bb53df9
2 changed files with 132 additions and 1 deletions
|
|
@ -15,6 +15,7 @@
|
|||
#include <vector>
|
||||
|
||||
class CView;
|
||||
class CMousePointer;
|
||||
class CCorpse;
|
||||
class CMsgEffect;
|
||||
class CGameActor;
|
||||
|
|
@ -52,7 +53,8 @@ public:
|
|||
/* 0078 */ unsigned char unknown_0078[0x54];
|
||||
/* 00CC */ CWorld* scene;
|
||||
/* 00D0 */ CView* camera;
|
||||
/* 00D4 */ unsigned char unknown_00D4[0x28];
|
||||
/* 00D4 */ CMousePointer* mousePointer;
|
||||
/* 00D8 */ unsigned char unknown_00D8[0x24];
|
||||
/* 00FC */ int unknown_00FC;
|
||||
/* 0100 */ unsigned char unknown_0100[0x18];
|
||||
/* 0118 */ std::string unknown_0118;
|
||||
|
|
@ -105,6 +107,13 @@ public:
|
|||
void WorldCell(float x, float z, int& column, int& row) const;
|
||||
void SubcellPosition(int column, int row, int subColumn, int subRow, float& x, float& z) const;
|
||||
void PlayerCell(int* column, int* row) const;
|
||||
int GetSkillAttackRange(int id, int level);
|
||||
int TerrainHeight() const;
|
||||
int TerrainWidth() const;
|
||||
std::string LocationText();
|
||||
bool HasInventoryItem(int id);
|
||||
bool HasResurrectionItem();
|
||||
void SendMousePointerState(int value);
|
||||
bool CanFindPath(int sx, int sy, int cellX, int cellY, int dx, int dy);
|
||||
bool IsAllowedPair(int kind, int value);
|
||||
bool IsWithinRange(const int& x1, const int& y1, const int& x2, const int& y2, int range);
|
||||
|
|
|
|||
|
|
@ -6,15 +6,22 @@
|
|||
#include "Contents/Camera/Camera.h"
|
||||
#include "Contents/Configuration/ServiceOptions.h"
|
||||
#include "Contents/MessageTable.h"
|
||||
#include "Contents/Actors/MousePointer.h"
|
||||
#include "Contents/Actors/RenderObject.h"
|
||||
#include "Contents/Items/ItemInfo.h"
|
||||
#include "Contents/Skills/ClientSkills.h"
|
||||
#include "Contents/Skills/SkillInfo.h"
|
||||
#include "Contents/World/World.h"
|
||||
#include "Network/Packets/PacketLengths.h"
|
||||
#include "Render/Renderer.h"
|
||||
#include "Resource/World/TerrainResource.h"
|
||||
#include "Script/LuaScript.h"
|
||||
#include "UI/Window/UIWindow.h"
|
||||
#include "UI/Window/UIWindowMgr.h"
|
||||
#include "Utility/Text/FormatString.h"
|
||||
|
||||
#include <cstdint>
|
||||
#include <cstdio>
|
||||
#include <cstring>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
|
@ -77,6 +84,121 @@ void CGameMode::CompleteUnknown0194(std::uint32_t id, const std::string& text) {
|
|||
}
|
||||
}
|
||||
|
||||
// OFFSET: 0x00CD52F0
|
||||
// FUNCTION: fn_21279
|
||||
int CGameMode::GetSkillAttackRange(int id, int level) {
|
||||
if (id == 10000) {
|
||||
return 5;
|
||||
}
|
||||
|
||||
int range = 1;
|
||||
CSkillInfo skill = reinterpret_cast<const ClientSkills&>(g_session).Lookup(id);
|
||||
if (!skill.available) {
|
||||
skill = g_session.m_skillBundle.Pending(id);
|
||||
if (!skill.available) {
|
||||
return range;
|
||||
}
|
||||
|
||||
level = skill.level;
|
||||
}
|
||||
|
||||
int reduction = 0;
|
||||
g_luaScript->Call("GetSkillAttackRange", "ddd>dd", id, level, skill.level, &range, &reduction);
|
||||
range += skill.unknown_001C - reduction;
|
||||
return range;
|
||||
}
|
||||
|
||||
// OFFSET: 0x00CD54D0
|
||||
// FUNCTION: fn_21280
|
||||
int CGameMode::TerrainHeight() const {
|
||||
if (!this->scene || !this->scene->terrain) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
return this->scene->terrain->height;
|
||||
}
|
||||
|
||||
// OFFSET: 0x00CD54F0
|
||||
// FUNCTION: fn_21281
|
||||
int CGameMode::TerrainWidth() const {
|
||||
if (!this->scene || !this->scene->terrain) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
return this->scene->terrain->width;
|
||||
}
|
||||
|
||||
// OFFSET: 0x00CD5550
|
||||
// FUNCTION: fn_21283
|
||||
std::string CGameMode::LocationText() {
|
||||
char text[120];
|
||||
std::memset(text, 0, sizeof(text));
|
||||
|
||||
int column;
|
||||
int row;
|
||||
const auto* player = reinterpret_cast<const CRenderObject*>(this->scene->player);
|
||||
this->WorldCell(player->render.position.x, player->render.position.z, column, row);
|
||||
|
||||
std::string name = this->mapName;
|
||||
if (name.size() > 4) {
|
||||
name.resize(name.size() - 4);
|
||||
}
|
||||
|
||||
std::sprintf(text, "Location: %s ( %d , %d )", name.c_str(), column, row);
|
||||
return text;
|
||||
}
|
||||
|
||||
// OFFSET: 0x00CD5800
|
||||
// FUNCTION: fn_21284
|
||||
bool CGameMode::HasInventoryItem(int id) {
|
||||
const ITEM_INFO item = LookupClientItem(g_session.m_inventoryItems, id, 0);
|
||||
return item.unknown_0000[1] != 0 && item.quantity > 0;
|
||||
}
|
||||
|
||||
// OFFSET: 0x00CD58B0
|
||||
// FUNCTION: fn_21285
|
||||
bool CGameMode::HasResurrectionItem() {
|
||||
ITEM_INFO item = LookupClientItem(g_session.m_inventoryItems, 7621, 0);
|
||||
const CWorld* world = this->scene;
|
||||
if (world->unknown_0048 || world->unknown_004C || world->unknown_0054) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (item.unknown_0000[1] != 0 && item.quantity > 0) {
|
||||
return true;
|
||||
}
|
||||
|
||||
item = LookupClientItem(g_session.m_inventoryItems, 6833, 0);
|
||||
if (item.unknown_0000[1] != 0 && item.quantity > 0) {
|
||||
return true;
|
||||
}
|
||||
|
||||
item = LookupClientItem(g_session.m_inventoryItems, 6316, 0);
|
||||
if (item.unknown_0000[1] != 0 && item.quantity > 0) {
|
||||
return true;
|
||||
}
|
||||
|
||||
item = LookupClientItem(g_session.m_inventoryItems, 6293, 0);
|
||||
if (item.unknown_0000[1] != 0 && item.quantity > 0) {
|
||||
return true;
|
||||
}
|
||||
|
||||
item = LookupClientItem(g_session.m_inventoryItems, 25310, 0);
|
||||
if (item.unknown_0000[1] != 0 && item.quantity > 0) {
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
// OFFSET: 0x00CD5CD0
|
||||
// FUNCTION: fn_21287
|
||||
void CGameMode::SendMousePointerState(int value) {
|
||||
if (this->mousePointer) {
|
||||
this->mousePointer->SendMsg(nullptr, 2, 0, value, value >> 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
|
||||
}
|
||||
}
|
||||
|
||||
// OFFSET: 0x00CECE00
|
||||
// FUNCTION: fn_21360
|
||||
void CGameMode::ClearUnknown0458() {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue