Skip to content

GetMessageOrigData(MsgMsgId) returns the current message ID instead of the original one #387

Description

@Nord1cWarr1or

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())

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions