forked from metin2/client
521 lines
13 KiB
C++
521 lines
13 KiB
C++
#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<std::string> 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:%d",
|
||
htoi(results[i].c_str()),
|
||
atoi(results[i+1].c_str()));
|
||
isAttr = true;
|
||
}
|
||
}
|
||
|
||
if (isAttr)
|
||
//"item:<3A><>ȣ:<3A>÷<EFBFBD><C3B7><EFBFBD>:<3A><><EFBFBD><EFBFBD>0:<3A><><EFBFBD><EFBFBD>1:<3A><><EFBFBD><EFBFBD>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);
|
||
}
|