Skip to content

Commit

Permalink
Improved Command Handling (#76)
Browse files Browse the repository at this point in the history
  • Loading branch information
roflmuffin authored Nov 13, 2023
1 parent 3176051 commit b09c2b6
Show file tree
Hide file tree
Showing 15 changed files with 183 additions and 501 deletions.
2 changes: 0 additions & 2 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -75,8 +75,6 @@ SET(SOURCE_FILES
src/core/managers/entity_manager.h
src/core/managers/chat_manager.cpp
src/core/managers/chat_manager.h
src/core/managers/client_command_manager.cpp
src/core/managers/client_command_manager.h
src/core/managers/server_manager.cpp
src/core/managers/server_manager.h
src/scripting/natives/natives_server.cpp
Expand Down
3 changes: 1 addition & 2 deletions managed/CounterStrikeSharp.API/Core/API.cs
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ public static bool RemoveListener(string name, InputArgument callback){
}
}

public static IntPtr AddCommand(string name, string description, bool serveronly, int flags, InputArgument callback){
public static void AddCommand(string name, string description, bool serveronly, int flags, InputArgument callback){
lock (ScriptContext.GlobalScriptContext.Lock) {
ScriptContext.GlobalScriptContext.Reset();
ScriptContext.GlobalScriptContext.Push(name);
Expand All @@ -41,7 +41,6 @@ public static IntPtr AddCommand(string name, string description, bool serveronly
ScriptContext.GlobalScriptContext.SetIdentifier(0x807C6B9C);
ScriptContext.GlobalScriptContext.Invoke();
ScriptContext.GlobalScriptContext.CheckErrors();
return (IntPtr)ScriptContext.GlobalScriptContext.GetResult(typeof(IntPtr));
}
}

Expand Down
10 changes: 3 additions & 7 deletions managed/CounterStrikeSharp.API/Core/BasePlugin.cs
Original file line number Diff line number Diff line change
Expand Up @@ -209,14 +209,10 @@ public void AddCommandListener(string? name, CommandInfo.CommandListenerCallback
{
var wrappedHandler = new Func<int, IntPtr, HookResult>((i, ptr) =>
{
if (i == -1)
{
return HookResult.Continue;
}
var caller = (i != -1) ? new CCSPlayerController(NativeAPI.GetEntityFromIndex(i + 1)) : null;

var entity = new CCSPlayerController(NativeAPI.GetEntityFromIndex(i + 1));
var command = new CommandInfo(ptr, entity);
return handler.Invoke(entity.IsValid ? entity : null, command);
var command = new CommandInfo(ptr, caller);
return handler.Invoke(caller, command);
});

var subscriber = new CallbackSubscriber(handler, wrappedHandler, () => { RemoveCommandListener(name, handler, mode); });
Expand Down
2 changes: 0 additions & 2 deletions src/core/globals.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,6 @@
#include "memory_module.h"
#include "interfaces/cs2_interfaces.h"
#include "core/managers/entity_manager.h"
#include "core/managers/client_command_manager.h"
#include "core/managers/server_manager.h"
#include <public/game/server/iplayerinfo.h>
#include <public/entity2/entitysystem.h>
Expand Down Expand Up @@ -76,7 +75,6 @@ TimerSystem timerSystem;
ConCommandManager conCommandManager;
EntityManager entityManager;
ChatManager chatManager;
ClientCommandManager clientCommandManager;
ServerManager serverManager;

void Initialize() {
Expand Down
2 changes: 0 additions & 2 deletions src/core/globals.h
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,6 @@ class ChatCommands;
class HookManager;
class EntityManager;
class ChatManager;
class ClientCommandManager;
class ServerManager;
class CGameConfig;

Expand Down Expand Up @@ -92,7 +91,6 @@ extern EntityManager entityManager;
extern TimerSystem timerSystem;
extern ChatCommands chatCommands;
extern ChatManager chatManager;
extern ClientCommandManager clientCommandManager;
extern ServerManager serverManager;

extern HookManager hookManager;
Expand Down
43 changes: 21 additions & 22 deletions src/core/managers/chat_manager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -39,8 +39,7 @@ ChatManager::~ChatManager() {}
void ChatManager::OnAllInitialized()
{
m_pHostSay = reinterpret_cast<HostSay>(
modules::server->FindSignature(globals::gameConfig->GetSignature("Host_Say"))
);
modules::server->FindSignature(globals::gameConfig->GetSignature("Host_Say")));

if (m_pHostSay == nullptr) {
CSSHARP_CORE_ERROR("Failed to find signature for \'Host_Say\'");
Expand All @@ -60,38 +59,36 @@ void DetourHostSay(CBaseEntity* pController, CCommand& args, bool teamonly, int
CCommand newArgs;
newArgs.Tokenize(args.Arg(1));

if (*args[1] == '/' || *args[1] == '!') {
globals::chatManager.OnSayCommandPost(pController, newArgs);
return;
}

m_pHostSay(pController, args, teamonly, unk1, unk2);

if (pController) {
auto pEvent = globals::gameEventManager->CreateEvent("player_chat", true);
if (pEvent) {
pEvent->SetBool("teamonly", teamonly);
pEvent->SetInt("userid", pController->GetEntityIndex().Get());
pEvent->SetInt("userid", pController->GetEntityIndex().Get() - 1);
pEvent->SetString("text", args[1]);

globals::gameEventManager->FireEvent(pEvent, true);
}
}
}

bool ChatManager::OnSayCommandPre(CBaseEntity* pController, CCommand& command) {
return false;
if (*args[1] == '/' || *args[1] == '!') {
globals::chatManager.OnSayCommandPost(pController, newArgs);
return;
}

m_pHostSay(pController, args, teamonly, unk1, unk2);
}

bool ChatManager::OnSayCommandPost(CBaseEntity* pController, CCommand& command)
bool ChatManager::OnSayCommandPre(CBaseEntity* pController, CCommand& command) { return false; }

void ChatManager::OnSayCommandPost(CBaseEntity* pController, CCommand& command)
{
const char* args = command.ArgS();
auto commandStr = command.Arg(0);

return InternalDispatch(pController, commandStr + 1, command);
}

bool ChatManager::InternalDispatch(CBaseEntity* pPlayerController, const char* szTriggerPhase,
void ChatManager::InternalDispatch(CBaseEntity* pPlayerController, const char* szTriggerPhase,
CCommand& fullCommand)
{
auto ppArgV = new const char*[fullCommand.ArgC()];
Expand All @@ -102,26 +99,28 @@ bool ChatManager::InternalDispatch(CBaseEntity* pPlayerController, const char* s

auto prefixedPhrase = std::string("css_") + szTriggerPhase;

auto command = globals::conCommandManager.FindCommand(prefixedPhrase.c_str());
auto bValidWithPrefix = globals::conCommandManager.IsValidValveCommand(prefixedPhrase.c_str());

if (command) {
if (bValidWithPrefix) {
ppArgV[0] = prefixedPhrase.c_str();
}

CCommand commandCopy(fullCommand.ArgC(), ppArgV);

if (pPlayerController == nullptr) {
auto result = globals::conCommandManager.InternalDispatch(CPlayerSlot(-1), &commandCopy);
globals::conCommandManager.ExecuteCommandCallbacks(
commandCopy.Arg(0), CCommandContext(CommandTarget_t::CT_NO_TARGET, CPlayerSlot(-1)),
commandCopy, HookMode::Pre);
delete[] ppArgV;
return result;
return;
}

auto index = pPlayerController->GetEntityIndex().Get();

auto slot = CPlayerSlot(index - 1);

auto result = globals::conCommandManager.InternalDispatch(slot, &commandCopy);
globals::conCommandManager.ExecuteCommandCallbacks(
commandCopy.Arg(0), CCommandContext(CommandTarget_t::CT_NO_TARGET, slot), commandCopy,
HookMode::Pre);
delete[] ppArgV;
return result;
}
} // namespace counterstrikesharp
4 changes: 2 additions & 2 deletions src/core/managers/chat_manager.h
Original file line number Diff line number Diff line change
Expand Up @@ -53,10 +53,10 @@ class ChatManager : public GlobalClass
void OnShutdown() override;

bool OnSayCommandPre(CBaseEntity* pController, CCommand& args);
bool OnSayCommandPost(CBaseEntity* pController, CCommand& args);
void OnSayCommandPost(CBaseEntity* pController, CCommand& args);

private:
bool InternalDispatch(CBaseEntity* pPlayerController, const char* szTriggerPhrase,
void InternalDispatch(CBaseEntity* pPlayerController, const char* szTriggerPhrase,
CCommand& pFullCommand);

std::vector<ChatCommandInfo*> m_cmd_list;
Expand Down
147 changes: 0 additions & 147 deletions src/core/managers/client_command_manager.cpp

This file was deleted.

45 changes: 0 additions & 45 deletions src/core/managers/client_command_manager.h

This file was deleted.

Loading

0 comments on commit b09c2b6

Please sign in to comment.