Summary
GetMessageOrigData with MsgMsgId returns the current message id (getId()) instead of the original one, breaking the native's contract ("Gets the message data original value in the current game message"). All other Original branches use the original getters correctly.
Evidence
reapi/src/natives/natives_hookmessage.cpp (function GetMessageOrigData):
case IMessage::DataType::Dest:
return static_cast<cell>(g_activeMessageContext->getOriginalDest()); // OK
case IMessage::DataType::Index:
return g_activeMessageContext->getId(); // BUG: current id
case IMessage::DataType::Origin:
*(Vector *)getAmxAddr(amx, params[arg_value]) = g_activeMessageContext->getOriginalOrigin(); // OK
case IMessage::DataType::Edict:
return indexOfEdictAmx(g_activeMessageContext->getOriginalEdict()); // OK
The correct getter already exists in the interface: virtual int getOriginalId() const = 0; (include/cssdk/engine/IMessageManager.h, IMessageContext).
Repro (Pawn)
// inside a RegisterMessage callback (pre):
SetMessageData(MsgMsgId, 999);
new orig = GetMessageOrigData(MsgMsgId);
// expected: original message id; actual: 999 (the modified value)
Suggested fix
case IMessage::DataType::Index:
return g_activeMessageContext->getOriginalId();
Environment
- ReAPI module, current master (verified on local checkout, commit 0686229)
- ReHLDS ReHLDS-3.x (message manager impl exposes
getOriginalId())
Summary
GetMessageOrigDatawithMsgMsgIdreturns the current message id (getId()) instead of the original one, breaking the native's contract ("Gets the message data original value in the current game message"). All otherOriginalbranches use the original getters correctly.Evidence
reapi/src/natives/natives_hookmessage.cpp(functionGetMessageOrigData):The correct getter already exists in the interface:
virtual int getOriginalId() const = 0;(include/cssdk/engine/IMessageManager.h,IMessageContext).Repro (Pawn)
Suggested fix
Environment
getOriginalId())