You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
856 lines
30 KiB
856 lines
30 KiB
/*==LICENSE==* |
|
|
|
CyanWorlds.com Engine - MMOG client, server and tools |
|
Copyright (C) 2011 Cyan Worlds, Inc. |
|
|
|
This program is free software: you can redistribute it and/or modify |
|
it under the terms of the GNU General Public License as published by |
|
the Free Software Foundation, either version 3 of the License, or |
|
(at your option) any later version. |
|
|
|
This program is distributed in the hope that it will be useful, |
|
but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
GNU General Public License for more details. |
|
|
|
You should have received a copy of the GNU General Public License |
|
along with this program. If not, see <http://www.gnu.org/licenses/>. |
|
|
|
Additional permissions under GNU GPL version 3 section 7 |
|
|
|
If you modify this Program, or any covered work, by linking or |
|
combining it with any of RAD Game Tools Bink SDK, Autodesk 3ds Max SDK, |
|
NVIDIA PhysX SDK, Microsoft DirectX SDK, OpenSSL library, Independent |
|
JPEG Group JPEG library, Microsoft Windows Media SDK, or Apple QuickTime SDK |
|
(or a modified version of those libraries), |
|
containing parts covered by the terms of the Bink SDK EULA, 3ds Max EULA, |
|
PhysX SDK EULA, DirectX SDK EULA, OpenSSL and SSLeay licenses, IJG |
|
JPEG Library README, Windows Media SDK EULA, or QuickTime SDK EULA, the |
|
licensors of this Program grant you additional |
|
permission to convey the resulting work. Corresponding Source for a |
|
non-source form of such a combination shall include the source code for |
|
the parts of OpenSSL and IJG JPEG Library used as well as that of the covered |
|
work. |
|
|
|
You can contact Cyan Worlds, Inc. by email legal@cyan.com |
|
or by snail mail at: |
|
Cyan Worlds, Inc. |
|
14617 N Newport Hwy |
|
Mead, WA 99021 |
|
|
|
*==LICENSE==*/ |
|
#include "cyMisc.h" |
|
#include "pyGlueHelpers.h" |
|
#include "pyKey.h" |
|
#include "pySceneObject.h" |
|
#include "pyAgeInfoStruct.h" |
|
#include "pyGeometry3.h" |
|
#include "../NucleusLib/inc/plPipeline.h" |
|
#include "../pnNetBase/pnNetBase.h" |
|
|
|
#include <python.h> |
|
|
|
PYTHON_GLOBAL_METHOD_DEFINITION(PtRequestLOSScreen, args, "Params: selfKey,ID,xPos,yPos,distance,what,reportType\nRequest a LOS check from a point on the screen") |
|
{ |
|
PyObject* keyObj = NULL; |
|
long id; |
|
float xPos, yPos, distance; |
|
int what, reportType; |
|
if (!PyArg_ParseTuple(args, "Olfffii", &keyObj, &id, &xPos, &yPos, &distance, &what, &reportType)) |
|
{ |
|
PyErr_SetString(PyExc_TypeError, "PtRequestLOSScreen expects a ptKey, a long, three floats, and two ints"); |
|
PYTHON_RETURN_ERROR; |
|
} |
|
if (!pyKey::Check(keyObj)) |
|
{ |
|
PyErr_SetString(PyExc_TypeError, "PtRequestLOSScreen expects a ptKey, a long, three floats, and two ints"); |
|
PYTHON_RETURN_ERROR; |
|
} |
|
pyKey* key = pyKey::ConvertFrom(keyObj); |
|
PYTHON_RETURN_BOOL(cyMisc::RequestLOSScreen(*key, id, xPos, yPos, distance, what, reportType)); |
|
} |
|
|
|
PYTHON_GLOBAL_METHOD_DEFINITION(PtKillParticles, args, "Params: timeRemaining,pctToKill,particleSystem\nTells particleSystem to kill pctToKill percent of its particles") |
|
{ |
|
float timeRemaining, pctToKill; |
|
PyObject* keyObj = NULL; |
|
if (!PyArg_ParseTuple(args, "ffO", &timeRemaining, &pctToKill, &keyObj)) |
|
{ |
|
PyErr_SetString(PyExc_TypeError, "PtKillParticles expects two floats and a ptKey"); |
|
PYTHON_RETURN_ERROR; |
|
} |
|
if (!pyKey::Check(keyObj)) |
|
{ |
|
PyErr_SetString(PyExc_TypeError, "PtKillParticles expects two floats and a ptKey"); |
|
PYTHON_RETURN_ERROR; |
|
} |
|
pyKey* key = pyKey::ConvertFrom(keyObj); |
|
cyMisc::KillParticles(timeRemaining, pctToKill, *key); |
|
PYTHON_RETURN_NONE; |
|
} |
|
|
|
PYTHON_GLOBAL_METHOD_DEFINITION(PtGetNumParticles, args, "Params: key\nKey is the key of scene object host to particle system") |
|
{ |
|
PyObject* keyObj = NULL; |
|
if (!PyArg_ParseTuple(args, "O", &keyObj)) |
|
{ |
|
PyErr_SetString(PyExc_TypeError, "PtGetNumParticles expects a ptKey"); |
|
PYTHON_RETURN_ERROR; |
|
} |
|
if (!pyKey::Check(keyObj)) |
|
{ |
|
PyErr_SetString(PyExc_TypeError, "PtGetNumParticles expects a ptKey"); |
|
PYTHON_RETURN_ERROR; |
|
} |
|
pyKey* key = pyKey::ConvertFrom(keyObj); |
|
return PyInt_FromLong(cyMisc::GetNumParticles(*key)); |
|
} |
|
|
|
PYTHON_GLOBAL_METHOD_DEFINITION(PtSetParticleOffset, args, "Params: x,y,z,particlesys\nSets the particlesys particle system's offset") |
|
{ |
|
float x,y,z; |
|
PyObject* keyObj = NULL; |
|
if (!PyArg_ParseTuple(args, "fffO", &x, &y, &z, &keyObj)) |
|
{ |
|
PyErr_SetString(PyExc_TypeError, "PtSetParticleOffset expects three floats and a ptKey"); |
|
PYTHON_RETURN_ERROR; |
|
} |
|
if (!pyKey::Check(keyObj)) |
|
{ |
|
PyErr_SetString(PyExc_TypeError, "PtSetParticleOffset expects three floats and a ptKey"); |
|
PYTHON_RETURN_ERROR; |
|
} |
|
pyKey* key = pyKey::ConvertFrom(keyObj); |
|
cyMisc::SetParticleOffset(x, y, z, *key); |
|
PYTHON_RETURN_NONE; |
|
} |
|
|
|
PYTHON_GLOBAL_METHOD_DEFINITION(PtSetLightValue, args, "Params: key,name,r,g,b,a\n Key is the key of scene object host to light. Name is the name of the light to manipulate") |
|
{ |
|
PyObject* keyObj = NULL; |
|
PyObject* nameObj = NULL; |
|
float r,g,b,a; |
|
if (!PyArg_ParseTuple(args, "OOffff", &keyObj, &nameObj, &r, &g, &b, &a)) |
|
{ |
|
PyErr_SetString(PyExc_TypeError, "PtSetLightValue expects a ptKey, a string, and four floats"); |
|
PYTHON_RETURN_ERROR; |
|
} |
|
if (!pyKey::Check(keyObj)) |
|
{ |
|
PyErr_SetString(PyExc_TypeError, "PtSetLightValue expects a ptKey, a string, and four floats"); |
|
PYTHON_RETURN_ERROR; |
|
} |
|
pyKey* key = pyKey::ConvertFrom(keyObj); |
|
std::string name = ""; |
|
if (PyUnicode_Check(nameObj)) |
|
{ |
|
int strLen = PyUnicode_GetSize(nameObj); |
|
wchar_t* text = TRACKED_NEW wchar_t[strLen + 1]; |
|
PyUnicode_AsWideChar((PyUnicodeObject*)nameObj, text, strLen); |
|
text[strLen] = L'\0'; |
|
char* cText = hsWStringToString(text); |
|
name = cText; |
|
delete [] cText; |
|
delete [] text; |
|
} |
|
else if (PyString_Check(nameObj)) |
|
{ |
|
// we'll allow this, just in case something goes weird |
|
char* text = PyString_AsString(nameObj); |
|
name = text; |
|
} |
|
else |
|
{ |
|
PyErr_SetString(PyExc_TypeError, "PtSetLightValue expects a ptKey, a string, and four floats"); |
|
PYTHON_RETURN_ERROR; |
|
} |
|
cyMisc::SetLightColorValue(*key, name, r, g, b, a); |
|
PYTHON_RETURN_NONE; |
|
} |
|
|
|
PYTHON_GLOBAL_METHOD_DEFINITION(PtSetLightAnimStart, args, "Params: key,name,start\n Key is the key of scene object host to light, start is a bool. Name is the name of the light to manipulate") |
|
{ |
|
PyObject* keyObj = NULL; |
|
PyObject* nameObj = NULL; |
|
char start; |
|
if (!PyArg_ParseTuple(args, "OOb", &keyObj, &nameObj, &start)) |
|
{ |
|
PyErr_SetString(PyExc_TypeError, "PtSetLightAnimStart expects a ptKey, a string, and a boolean"); |
|
PYTHON_RETURN_ERROR; |
|
} |
|
if (!pyKey::Check(keyObj)) |
|
{ |
|
PyErr_SetString(PyExc_TypeError, "PtSetLightAnimStart expects a ptKey, a string, and a boolean"); |
|
PYTHON_RETURN_ERROR; |
|
} |
|
pyKey* key = pyKey::ConvertFrom(keyObj); |
|
std::string name = ""; |
|
if (PyUnicode_Check(nameObj)) |
|
{ |
|
int strLen = PyUnicode_GetSize(nameObj); |
|
wchar_t* text = TRACKED_NEW wchar_t[strLen + 1]; |
|
PyUnicode_AsWideChar((PyUnicodeObject*)nameObj, text, strLen); |
|
text[strLen] = L'\0'; |
|
char* cText = hsWStringToString(text); |
|
name = cText; |
|
delete [] cText; |
|
delete [] text; |
|
} |
|
else if (PyString_Check(nameObj)) |
|
{ |
|
// we'll allow this, just in case something goes weird |
|
char* text = PyString_AsString(nameObj); |
|
name = text; |
|
} |
|
else |
|
{ |
|
PyErr_SetString(PyExc_TypeError, "PtSetLightAnimStart expects a ptKey, a string, and a boolean"); |
|
PYTHON_RETURN_ERROR; |
|
} |
|
cyMisc::SetLightAnimationOn(*key, name, start != 0); |
|
PYTHON_RETURN_NONE; |
|
} |
|
|
|
PYTHON_GLOBAL_METHOD_DEFINITION_NOARGS(PtIsSinglePlayerMode, "Returns whether the game is in single player mode or not") |
|
{ |
|
PYTHON_RETURN_BOOL(cyMisc::IsSinglePlayerMode()); |
|
} |
|
|
|
PYTHON_GLOBAL_METHOD_DEFINITION_NOARGS(PtIsDemoMode, "Returns whether the game is in Demo mode or not") |
|
{ |
|
PYTHON_RETURN_BOOL(cyMisc::IsDemoMode()); |
|
} |
|
|
|
PYTHON_GLOBAL_METHOD_DEFINITION_NOARGS(PtIsInternalRelease, "Returns whether the client is an internal build or not") |
|
{ |
|
PYTHON_RETURN_BOOL(cyMisc::IsInternalRelease()); |
|
} |
|
|
|
PYTHON_GLOBAL_METHOD_DEFINITION_NOARGS(PtIsEnterChatModeKeyBound, "Returns whether the EnterChatMode is bound to a key") |
|
{ |
|
PYTHON_RETURN_BOOL(cyMisc::IsEnterChatModeKeyBound()); |
|
} |
|
|
|
PYTHON_GLOBAL_METHOD_DEFINITION(PtShootBulletFromScreen, args, "Params: selfkey, xPos, yPos, radius, range\nShoots a bullet from a position on the screen") |
|
{ |
|
PyObject* keyObj = NULL; |
|
float xPos, yPos, radius, range; |
|
if (!PyArg_ParseTuple(args, "Offff", &keyObj, &xPos, &yPos, &radius, &range)) |
|
{ |
|
PyErr_SetString(PyExc_TypeError, "PtShootBulletFromScreen expects a ptKey and four floats"); |
|
PYTHON_RETURN_ERROR; |
|
} |
|
if (!pyKey::Check(keyObj)) |
|
{ |
|
PyErr_SetString(PyExc_TypeError, "PtShootBulletFromScreen expects a ptKey and four floats"); |
|
PYTHON_RETURN_ERROR; |
|
} |
|
pyKey* key = pyKey::ConvertFrom(keyObj); |
|
cyMisc::ShootBulletFromScreen(*key, xPos, yPos, radius, range); |
|
PYTHON_RETURN_NONE; |
|
} |
|
|
|
PYTHON_GLOBAL_METHOD_DEFINITION(PtShootBulletFromObject, args, "Params: selfkey, gunObj, radius, range\nShoots a bullet from an object") |
|
{ |
|
PyObject* selfKeyObj = NULL; |
|
PyObject* gunSceneObj = NULL; |
|
float radius, range; |
|
if (!PyArg_ParseTuple(args, "OOff", &selfKeyObj, &gunSceneObj, &radius, &range)) |
|
{ |
|
PyErr_SetString(PyExc_TypeError, "PtShootBulletFromObject expects a ptKey, a ptSceneobject, and two floats"); |
|
PYTHON_RETURN_ERROR; |
|
} |
|
if ((!pyKey::Check(selfKeyObj)) || (!pySceneObject::Check(gunSceneObj))) |
|
{ |
|
PyErr_SetString(PyExc_TypeError, "PtShootBulletFromObject expects a ptKey, a ptSceneobject, and two floats"); |
|
PYTHON_RETURN_ERROR; |
|
} |
|
pyKey* selfKey = pyKey::ConvertFrom(selfKeyObj); |
|
pySceneObject* gunObj = pySceneObject::ConvertFrom(gunSceneObj); |
|
cyMisc::ShootBulletFromObject(*selfKey, gunObj, radius, range); |
|
PYTHON_RETURN_NONE; |
|
} |
|
|
|
PYTHON_GLOBAL_METHOD_DEFINITION(PtGetPublicAgeList, args, "Params: ageName, cbObject=None\nGet list of public ages for the given age name.\n" |
|
"cbObject, if supplied should have a method called gotPublicAgeList(self,ageList). ageList is a list of tuple(ptAgeInfoStruct,nPlayersInAge)") |
|
{ |
|
char* ageName; |
|
PyObject* cbObject = NULL; |
|
if (!PyArg_ParseTuple(args, "s|O", &ageName, &cbObject)) |
|
{ |
|
PyErr_SetString(PyExc_TypeError, "PtGetPublicAgeList expects a string and an optional object with a gotPublicAgeList() method"); |
|
PYTHON_RETURN_ERROR; |
|
} |
|
cyMisc::GetPublicAgeList(ageName, cbObject); |
|
PYTHON_RETURN_NONE; |
|
} |
|
|
|
PYTHON_GLOBAL_METHOD_DEFINITION(PtCreatePublicAge, args, "Params: ageInfo, cbObject=None\nCreate a public instance of the given age.\n" |
|
"cbObject, if supplied should have a member called publicAgeCreated(self,ageInfo)") |
|
{ |
|
PyObject* ageInfoObj = NULL; |
|
PyObject* cbObject = NULL; |
|
if (!PyArg_ParseTuple(args, "O|O", &ageInfoObj, &cbObject)) |
|
{ |
|
PyErr_SetString(PyExc_TypeError, "PtCreatePublicAge expects a ptAgeInfoStruct object and an optional object with a publicAgeCreated() method"); |
|
PYTHON_RETURN_ERROR; |
|
} |
|
if (!pyAgeInfoStruct::Check(ageInfoObj)) |
|
{ |
|
PyErr_SetString(PyExc_TypeError, "PtCreatePublicAge expects a ptAgeInfoStruct object and an optional object with a publicAgeCreated() method"); |
|
PYTHON_RETURN_ERROR; |
|
} |
|
pyAgeInfoStruct* ageInfo = pyAgeInfoStruct::ConvertFrom(ageInfoObj); |
|
cyMisc::CreatePublicAge(ageInfo, cbObject); |
|
PYTHON_RETURN_NONE; |
|
} |
|
|
|
PYTHON_GLOBAL_METHOD_DEFINITION(PtRemovePublicAge, args, "Params: ageInstanceGuid, cbObject=None\nRemove a public instance of the given age.\n" |
|
"cbObject, if supplied should have a member called publicAgeRemoved(self,ageInstanceGuid)") |
|
{ |
|
char* ageInstanceGUID; |
|
PyObject* cbObject = NULL; |
|
if (!PyArg_ParseTuple(args, "s|O", &ageInstanceGUID, &cbObject)) |
|
{ |
|
PyErr_SetString(PyExc_TypeError, "PtRemovePublicAge expects a string and an optional object with a publicAgeRemoved() method"); |
|
PYTHON_RETURN_ERROR; |
|
} |
|
cyMisc::RemovePublicAge(ageInstanceGUID, cbObject); |
|
PYTHON_RETURN_NONE; |
|
} |
|
|
|
PYTHON_GLOBAL_METHOD_DEFINITION(PtSetClearColor, args, "Params: red,green,blue\nSet the clear color") |
|
{ |
|
float red, green, blue; |
|
if (!PyArg_ParseTuple(args, "fff", &red, &green, &blue)) |
|
{ |
|
PyErr_SetString(PyExc_TypeError, "PtSetClearColor expects three floats"); |
|
PYTHON_RETURN_ERROR; |
|
} |
|
cyMisc::SetClearColor(red, green, blue); |
|
PYTHON_RETURN_NONE; |
|
} |
|
|
|
PYTHON_GLOBAL_METHOD_DEFINITION_NOARGS(PtGetLocalKILevel, "returns local player's ki level") |
|
{ |
|
return PyInt_FromLong(cyMisc::GetKILevel()); |
|
} |
|
|
|
PYTHON_BASIC_GLOBAL_METHOD_DEFINITION(PtClearCameraStack, cyMisc::ClearCameraStack, "clears all cameras") |
|
|
|
PYTHON_GLOBAL_METHOD_DEFINITION(PtGetCameraNumber, args, "Params: x\nReturns camera x's name from stack") |
|
{ |
|
int x; |
|
if (!PyArg_ParseTuple(args, "i", &x)) |
|
{ |
|
PyErr_SetString(PyExc_TypeError, "PtGetCameraNumber expects an int"); |
|
PYTHON_RETURN_ERROR; |
|
} |
|
return PyString_FromString(cyMisc::GetCameraNumber(x)); |
|
} |
|
|
|
PYTHON_GLOBAL_METHOD_DEFINITION_NOARGS(PtGetNumCameras, "returns camera stack size") |
|
{ |
|
return PyInt_FromLong(cyMisc::GetNumCameras()); |
|
} |
|
|
|
PYTHON_GLOBAL_METHOD_DEFINITION(PtRebuildCameraStack, args, "Params: name,ageName\nPush camera with this name on the stack") |
|
{ |
|
char* name; |
|
char* ageName; |
|
if (!PyArg_ParseTuple(args, "ss", &name, &ageName)) |
|
{ |
|
PyErr_SetString(PyExc_TypeError, "PtRebuildCameraStack expects two strings"); |
|
PYTHON_RETURN_ERROR; |
|
} |
|
cyMisc::RebuildCameraStack(name, ageName); |
|
PYTHON_RETURN_NONE; |
|
} |
|
|
|
PYTHON_BASIC_GLOBAL_METHOD_DEFINITION(PtRecenterCamera, cyMisc::RecenterCamera, "re-centers the camera") |
|
|
|
PYTHON_GLOBAL_METHOD_DEFINITION_NOARGS(PtFirstPerson, "is the local avatar in first person mode") |
|
{ |
|
PYTHON_RETURN_BOOL(cyMisc::IsFirstPerson()); |
|
} |
|
|
|
PYTHON_GLOBAL_METHOD_DEFINITION(PtFadeIn, args, "Params: lenTime, holdFlag, noSound=0\nFades screen in for lenTime seconds") |
|
{ |
|
float lenTime; |
|
char holdFlag, noSound = 0; |
|
if (!PyArg_ParseTuple(args, "fb|b", &lenTime, &holdFlag, &noSound)) |
|
{ |
|
PyErr_SetString(PyExc_TypeError, "PtFadeIn expects a float, a boolean, and an optional boolean"); |
|
PYTHON_RETURN_ERROR; |
|
} |
|
cyMisc::FadeIn(lenTime, holdFlag != 0, noSound != 0); |
|
PYTHON_RETURN_NONE; |
|
} |
|
|
|
PYTHON_GLOBAL_METHOD_DEFINITION(PtFadeOut, args, "Params: lenTime, holdFlag, noSound=0\nFades screen out for lenTime seconds") |
|
{ |
|
float lenTime; |
|
char holdFlag, noSound = 0; |
|
if (!PyArg_ParseTuple(args, "fb|b", &lenTime, &holdFlag, &noSound)) |
|
{ |
|
PyErr_SetString(PyExc_TypeError, "PtFadeOut expects a float, a boolean, and an optional boolean"); |
|
PYTHON_RETURN_ERROR; |
|
} |
|
cyMisc::FadeOut(lenTime, holdFlag != 0, noSound != 0); |
|
PYTHON_RETURN_NONE; |
|
} |
|
|
|
PYTHON_GLOBAL_METHOD_DEFINITION(PtSetGlobalClickability, args, "Params: enable\nEnable or disable all clickables on the local client") |
|
{ |
|
char enable; |
|
if (!PyArg_ParseTuple(args, "b", &enable)) |
|
{ |
|
PyErr_SetString(PyExc_TypeError, "PtSetGlobalClickability expects a boolean"); |
|
PYTHON_RETURN_ERROR; |
|
} |
|
cyMisc::SetClickability(enable != 0); |
|
PYTHON_RETURN_NONE; |
|
} |
|
|
|
PYTHON_GLOBAL_METHOD_DEFINITION(PtDebugAssert, args, "Params: cond, msg\nDebug only: Assert if condition is false.") |
|
{ |
|
char cond; |
|
char* msg; |
|
if (!PyArg_ParseTuple(args, "bs", &cond, &msg)) |
|
{ |
|
PyErr_SetString(PyExc_TypeError, "PtDebugAssert expects a boolean and a string"); |
|
PYTHON_RETURN_ERROR; |
|
} |
|
cyMisc::DebugAssert(cond != 0, msg); |
|
PYTHON_RETURN_NONE; |
|
} |
|
|
|
PYTHON_GLOBAL_METHOD_DEFINITION(PtSetAlarm, args, "Params: secs, cbObject, cbContext\nsecs is the amount of time before your alarm goes off.\n" |
|
"cbObject is a python object with the method onAlarm(int context)\ncbContext is an integer.") |
|
{ |
|
float secs; |
|
PyObject* cbObject = NULL; |
|
unsigned long cbContext; |
|
if (!PyArg_ParseTuple(args, "fOl", &secs, &cbObject, &cbContext)) |
|
{ |
|
PyErr_SetString(PyExc_TypeError, "PtSetAlarm expects a float, a object with a onAlarm() method, and an int"); |
|
PYTHON_RETURN_ERROR; |
|
} |
|
cyMisc::SetAlarm(secs, cbObject, cbContext); |
|
PYTHON_RETURN_NONE; |
|
} |
|
|
|
PYTHON_GLOBAL_METHOD_DEFINITION(PtSaveScreenShot, args, "Params: fileName,width=640,height=480,quality=75\nTakes a screenshot with the specified filename, size, and quality") |
|
{ |
|
char* fileName; |
|
int width = 640, height = 480, quality = 75; |
|
if (!PyArg_ParseTuple(args, "s|iii", &fileName, &width, &height, &quality)) |
|
{ |
|
PyErr_SetString(PyExc_TypeError, "PtSaveScreenShot expects a string, and three optional integers"); |
|
PYTHON_RETURN_ERROR; |
|
} |
|
cyMisc::SaveScreenShot(fileName, width, height, quality); |
|
PYTHON_RETURN_NONE; |
|
} |
|
|
|
PYTHON_GLOBAL_METHOD_DEFINITION(PtStartScreenCapture, args, "Params: selfKey,width=800,height=600\nStarts a capture of the screen") |
|
{ |
|
PyObject* keyObj = NULL; |
|
unsigned short width = 800, height = 600; |
|
if (!PyArg_ParseTuple(args, "O|hh", &keyObj, &width, &height)) |
|
{ |
|
PyErr_SetString(PyExc_TypeError, "PtStartScreenCapture expects a ptKey, and two optional unsigned 16-bit ints"); |
|
PYTHON_RETURN_ERROR; |
|
} |
|
if (!pyKey::Check(keyObj)) |
|
{ |
|
PyErr_SetString(PyExc_TypeError, "PtStartScreenCapture expects a ptKey, and two optional unsigned 16-bit ints"); |
|
PYTHON_RETURN_ERROR; |
|
} |
|
pyKey* key = pyKey::ConvertFrom(keyObj); |
|
cyMisc::StartScreenCaptureWH(*key, width, height); |
|
PYTHON_RETURN_NONE; |
|
} |
|
|
|
PYTHON_GLOBAL_METHOD_DEFINITION(PtSendKIGZMarkerMsg, args, "Params: markerNumber,sender\nSame as PtSendKIMessageInt except 'sender' could get a notify message back\n") |
|
{ |
|
long markerNumber; |
|
PyObject* keyObj = NULL; |
|
if (!PyArg_ParseTuple(args, "lO", &markerNumber, &keyObj)) |
|
{ |
|
PyErr_SetString(PyExc_TypeError, "PtSendKIGZMarkerMsg expects a long and a ptKey"); |
|
PYTHON_RETURN_ERROR; |
|
} |
|
if (!pyKey::Check(keyObj)) |
|
{ |
|
PyErr_SetString(PyExc_TypeError, "PtSendKIGZMarkerMsg expects a long and a ptKey"); |
|
PYTHON_RETURN_ERROR; |
|
} |
|
pyKey* key = pyKey::ConvertFrom(keyObj); |
|
cyMisc::SendKIGZMarkerMsg(markerNumber, *key); |
|
PYTHON_RETURN_NONE; |
|
} |
|
|
|
PYTHON_GLOBAL_METHOD_DEFINITION(PtSendKIRegisterImagerMsg, args, "Params: imagerName, sender\nSends a message to the KI to register the specified imager") |
|
{ |
|
char* name; |
|
PyObject* keyObj = NULL; |
|
if (!PyArg_ParseTuple(args, "sO", &name, &keyObj)) |
|
{ |
|
PyErr_SetString(PyExc_TypeError, "PtSendKIRegisterImagerMsg expects a string and a ptKey"); |
|
PYTHON_RETURN_ERROR; |
|
} |
|
if (!pyKey::Check(keyObj)) |
|
{ |
|
PyErr_SetString(PyExc_TypeError, "PtSendKIRegisterImagerMsg expects a string and a ptKey"); |
|
PYTHON_RETURN_ERROR; |
|
} |
|
pyKey* key = pyKey::ConvertFrom(keyObj); |
|
cyMisc::SendKIRegisterImagerMsg(name, *key); |
|
PYTHON_RETURN_NONE; |
|
} |
|
|
|
PYTHON_GLOBAL_METHOD_DEFINITION(PtWearMaintainerSuit, args, "Params: key,wearOrNot\nWears or removes the maintainer suit of clothes") |
|
{ |
|
PyObject* keyObj = NULL; |
|
char wearOrNot; |
|
if (!PyArg_ParseTuple(args, "Ob", &keyObj, &wearOrNot)) |
|
{ |
|
PyErr_SetString(PyExc_TypeError, "PtWearMaintainerSuit expects a ptKey and a boolean"); |
|
PYTHON_RETURN_ERROR; |
|
} |
|
if (!pyKey::Check(keyObj)) |
|
{ |
|
PyErr_SetString(PyExc_TypeError, "PtWearMaintainerSuit expects a ptKey and a boolean"); |
|
PYTHON_RETURN_ERROR; |
|
} |
|
pyKey* key = pyKey::ConvertFrom(keyObj); |
|
cyMisc::WearMaintainerSuit(*key, wearOrNot != 0); |
|
PYTHON_RETURN_NONE; |
|
} |
|
|
|
PYTHON_GLOBAL_METHOD_DEFINITION_WKEY(PtWearDefaultClothing, args, kw, "Params: key, broadcast=false\nForces the avatar to wear the default clothing set") |
|
{ |
|
char* kwlist[] = { "key", "broadcast", NULL }; |
|
PyObject* keyObj = NULL; |
|
bool broadcast = false; |
|
if (!PyArg_ParseTupleAndKeywords(args, kw, "O|b", kwlist, &keyObj, &broadcast)) |
|
{ |
|
PyErr_SetString(PyExc_TypeError, "PtWearDefaultClothing expects a ptKey and an optional bool"); |
|
PYTHON_RETURN_ERROR; |
|
} |
|
if (!pyKey::Check(keyObj)) |
|
{ |
|
PyErr_SetString(PyExc_TypeError, "PtWearDefaultClothing expects a ptKey and an optional bool"); |
|
PYTHON_RETURN_ERROR; |
|
} |
|
pyKey* key = pyKey::ConvertFrom(keyObj); |
|
cyMisc::WearDefaultClothing(*key, broadcast); |
|
PYTHON_RETURN_NONE; |
|
} |
|
|
|
PYTHON_GLOBAL_METHOD_DEFINITION_NOARGS(PtGetAgeTimeOfDayPercent, "Returns the current age time of day as a percent (0 to 1)") |
|
{ |
|
return PyFloat_FromDouble(cyMisc::GetAgeTimeOfDayPercent()); |
|
} |
|
|
|
PYTHON_GLOBAL_METHOD_DEFINITION(PtCheckVisLOS, args, "Params: startPoint,endPoint\nDoes LOS check from start to end") |
|
{ |
|
PyObject* startPointObj = NULL; |
|
PyObject* endPointObj = NULL; |
|
if (!PyArg_ParseTuple(args, "OO", &startPointObj, &endPointObj)) |
|
{ |
|
PyErr_SetString(PyExc_TypeError, "PtCheckVisLOS expects two ptPoint3 objects"); |
|
PYTHON_RETURN_ERROR; |
|
} |
|
if ((!pyPoint3::Check(startPointObj)) || (!pyPoint3::Check(endPointObj))) |
|
{ |
|
PyErr_SetString(PyExc_TypeError, "PtCheckVisLOS expects two ptPoint3 objects"); |
|
PYTHON_RETURN_ERROR; |
|
} |
|
pyPoint3* startPoint = pyPoint3::ConvertFrom(startPointObj); |
|
pyPoint3* endPoint = pyPoint3::ConvertFrom(endPointObj); |
|
return cyMisc::CheckVisLOS(*startPoint, *endPoint); |
|
} |
|
|
|
PYTHON_GLOBAL_METHOD_DEFINITION_NOARGS(PtCheckVisLOSFromCursor, "Does LOS check from where the mouse cursor is, into the screen") |
|
{ |
|
return cyMisc::CheckVisLOSFromCursor(); |
|
} |
|
|
|
PYTHON_GLOBAL_METHOD_DEFINITION(PtEnablePlanarReflections, args, "Params: on\nEnables/disables planar reflections") |
|
{ |
|
char on; |
|
if (!PyArg_ParseTuple(args, "b", &on)) |
|
{ |
|
PyErr_SetString(PyExc_TypeError, "PtEnablePlanarReflections expects a boolean"); |
|
PYTHON_RETURN_ERROR; |
|
} |
|
cyMisc::EnablePlanarReflections(on != 0); |
|
PYTHON_RETURN_NONE; |
|
} |
|
|
|
PYTHON_GLOBAL_METHOD_DEFINITION_NOARGS(PtGetSupportedDisplayModes, "Returns a list of supported resolutions") |
|
{ |
|
std::vector<plDisplayMode> res; |
|
cyMisc::GetSupportedDisplayModes(&res); |
|
PyObject *retVal = PyList_New(0); |
|
for (std::vector<plDisplayMode>::iterator curArg = res.begin(); curArg != res.end(); ++curArg) |
|
{ |
|
PyObject* tup = PyTuple_New(2); |
|
PyTuple_SetItem(tup, 0, PyInt_FromLong((long)(*curArg).Width)); |
|
PyTuple_SetItem(tup, 1, PyInt_FromLong((long)(*curArg).Height)); |
|
|
|
PyList_Append(retVal, tup); |
|
} |
|
return retVal; |
|
} |
|
PYTHON_GLOBAL_METHOD_DEFINITION_NOARGS(PtGetDesktopWidth, "Returns desktop width") |
|
{ |
|
return PyInt_FromLong((long)cyMisc::GetDesktopWidth()); |
|
} |
|
|
|
PYTHON_GLOBAL_METHOD_DEFINITION_NOARGS(PtGetDesktopHeight, "Returns desktop height") |
|
{ |
|
return PyInt_FromLong((long)cyMisc::GetDesktopHeight()); |
|
} |
|
|
|
PYTHON_GLOBAL_METHOD_DEFINITION_NOARGS(PtGetDesktopColorDepth, "Returns desktop ColorDepth") |
|
{ |
|
return PyInt_FromLong((long)cyMisc::GetDesktopColorDepth()); |
|
} |
|
|
|
PYTHON_GLOBAL_METHOD_DEFINITION_NOARGS(PtGetDefaultDisplayParams, "Returns the default resolution and display settings") |
|
{ |
|
PipelineParams *pp = cyMisc::GetDefaultDisplayParams(); |
|
PyObject* tup = PyTuple_New(10); |
|
PyTuple_SetItem(tup, 0, PyInt_FromLong((long)pp->Width)); |
|
PyTuple_SetItem(tup, 1, PyInt_FromLong((long)pp->Height)); |
|
PyTuple_SetItem(tup, 2, PyInt_FromLong((long)pp->Windowed)); |
|
PyTuple_SetItem(tup, 3, PyInt_FromLong((long)pp->ColorDepth)); |
|
PyTuple_SetItem(tup, 4, PyInt_FromLong((long)pp->AntiAliasingAmount)); |
|
PyTuple_SetItem(tup, 5, PyInt_FromLong((long)pp->AnisotropicLevel)); |
|
PyTuple_SetItem(tup, 6, PyInt_FromLong((long)pp->TextureQuality)); |
|
PyTuple_SetItem(tup, 7, PyInt_FromLong((long)pp->VideoQuality)); |
|
PyTuple_SetItem(tup, 8, PyInt_FromLong((long)pp->Shadows)); |
|
PyTuple_SetItem(tup, 9, PyInt_FromLong((long)pp->PlanarReflections)); |
|
return tup; |
|
} |
|
|
|
PYTHON_GLOBAL_METHOD_DEFINITION(PtSetGraphicsOptions, args, "Params: width, height, colordepth, windowed, numAAsamples, numAnisoSamples, VSync\nSet the graphics options") |
|
{ |
|
int width = 800, height = 600, colordepth = 32, windowed = 0, numAAsamples = 0, numAnisoSamples = 0, vsync = 0; |
|
if (!PyArg_ParseTuple(args, "iiiiiii", &width, &height, &colordepth, &windowed, &numAAsamples, &numAnisoSamples, &vsync)) |
|
{ |
|
PyErr_SetString(PyExc_TypeError, "PtSetGraphicsOptions expects a ints for width, height, colordepth, windowed, numAAsamples, numAnisoSamples"); |
|
PYTHON_RETURN_ERROR; |
|
} |
|
|
|
cyMisc::SetGraphicsOptions(width, height, colordepth, windowed != 0, numAAsamples, numAnisoSamples, vsync != 0); |
|
PYTHON_RETURN_NONE; |
|
} |
|
|
|
PYTHON_GLOBAL_METHOD_DEFINITION(PtSetBehaviorNetFlags, args, "Params: behKey, netForce, netProp\nSets net flags on the associated behavior") |
|
{ |
|
PyObject* keyObj = NULL; |
|
char netForce; |
|
char netProp; |
|
if (!PyArg_ParseTuple(args, "Obb", &keyObj, &netForce, &netProp)) |
|
{ |
|
PyErr_SetString(PyExc_TypeError, "PtSetBehaviorNetFlags expects a ptKey, a boolean and a boolean"); |
|
PYTHON_RETURN_ERROR; |
|
} |
|
if (!pyKey::Check(keyObj)) |
|
{ |
|
PyErr_SetString(PyExc_TypeError, "PtSetBehaviorNetFlags expects a ptKey, a boolean and a boolean"); |
|
PYTHON_RETURN_ERROR; |
|
} |
|
pyKey* key = pyKey::ConvertFrom(keyObj); |
|
cyMisc::SetBehaviorNetFlags(*key, netForce != 0, netProp != 0); |
|
PYTHON_RETURN_NONE; |
|
} |
|
|
|
PYTHON_GLOBAL_METHOD_DEFINITION(PtSendFriendInvite, args, "Params: emailAddress, toName = \"Friend\"\nSends an email with invite code") |
|
{ |
|
PyObject* emailObj; |
|
PyObject* toNameObj = nil; |
|
if (!PyArg_ParseTuple(args, "O|O", &emailObj, &toNameObj)) |
|
{ |
|
PyErr_SetString(PyExc_TypeError, "PtSendFriendInvite expects a string and optionally another string"); |
|
PYTHON_RETURN_ERROR; |
|
} |
|
|
|
wchar emailAddr[kMaxEmailAddressLength]; |
|
MemSet(emailAddr, 0, sizeof(emailAddr)); |
|
|
|
wchar toName[kMaxPlayerNameLength]; |
|
MemSet(toName, 0, sizeof(toName)); |
|
|
|
// Check and see if the email address is ok |
|
int origStrLen = 0; |
|
if (PyUnicode_Check(emailObj)) |
|
{ |
|
origStrLen = PyUnicode_GET_SIZE(emailObj); |
|
PyUnicode_AsWideChar((PyUnicodeObject*)emailObj, emailAddr, arrsize(emailAddr) - 1); |
|
} |
|
else if (PyString_Check(emailObj)) |
|
{ |
|
char* cAddr = PyString_AsString(emailObj); |
|
origStrLen = StrLen(cAddr); |
|
StrToUnicode(emailAddr, cAddr, arrsize(emailAddr)); |
|
} |
|
else |
|
{ |
|
PyErr_SetString(PyExc_TypeError, "PtSendFriendInvite expects a string and optionally another string"); |
|
PYTHON_RETURN_ERROR; |
|
} |
|
|
|
if (origStrLen >= kMaxEmailAddressLength) |
|
{ |
|
PyErr_SetString(PyExc_TypeError, "PtSendFriendInvite: Email address too long"); |
|
PYTHON_RETURN_ERROR; |
|
} |
|
|
|
// Check if the "to name" field is ok |
|
if (toNameObj) |
|
{ |
|
if (PyUnicode_Check(toNameObj)) |
|
{ |
|
origStrLen = PyUnicode_GET_SIZE(toNameObj); |
|
PyUnicode_AsWideChar((PyUnicodeObject*)toNameObj, toName, arrsize(toName) - 1); |
|
} |
|
else if (PyString_Check(toNameObj)) |
|
{ |
|
char* cName = PyString_AsString(toNameObj); |
|
origStrLen = StrLen(cName); |
|
StrToUnicode(toName, cName, arrsize(toName)); |
|
} |
|
else |
|
StrCopy(toName, L"Friend", arrsize(toName)); |
|
} |
|
else |
|
StrCopy(toName, L"Friend", arrsize(toName)); |
|
|
|
cyMisc::SendFriendInvite(emailAddr, toName); |
|
PYTHON_RETURN_NONE; |
|
} |
|
|
|
PYTHON_GLOBAL_METHOD_DEFINITION_NOARGS(PtGuidGenerate, "Returns string representation for a new guid") |
|
{ |
|
return cyMisc::PyGuidGenerate(); |
|
} |
|
|
|
PYTHON_GLOBAL_METHOD_DEFINITION(PtGetAIAvatarsByModelName, args, "Params: modelName\nReturns a list of tuples representing the matching ai avatars") |
|
{ |
|
char* modelName; |
|
if (!PyArg_ParseTuple(args, "s", &modelName)) |
|
{ |
|
PyErr_SetString(PyExc_TypeError, "PtGetAIAvatarsByModelName expects a string"); |
|
PYTHON_RETURN_ERROR; |
|
} |
|
|
|
return cyMisc::GetAIAvatarsByModelName(modelName); |
|
} |
|
|
|
PYTHON_GLOBAL_METHOD_DEFINITION(PtForceVaultNodeUpdate, args, "Params: nodeId\nForces a vault node to update") |
|
{ |
|
unsigned nodeId; |
|
if (!PyArg_ParseTuple(args, "I", &nodeId)) |
|
{ |
|
PyErr_SetString(PyExc_TypeError, "PtForceVaultNodeUpdate expects an unsigned int"); |
|
PYTHON_RETURN_ERROR; |
|
} |
|
|
|
cyMisc::ForceVaultNodeUpdate(nodeId); |
|
PYTHON_RETURN_NONE; |
|
} |
|
|
|
PYTHON_GLOBAL_METHOD_DEFINITION(PtVaultDownload, args, "Params: nodeId\nDownloads the vault tree of the given nodeid") |
|
{ |
|
unsigned nodeId; |
|
if (!PyArg_ParseTuple(args, "I", &nodeId)) |
|
{ |
|
PyErr_SetString(PyExc_TypeError, "PtVaultDownload expects an unsigned int"); |
|
PYTHON_RETURN_ERROR; |
|
} |
|
|
|
cyMisc::VaultDownload(nodeId); |
|
PYTHON_RETURN_NONE; |
|
} |
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////// |
|
// |
|
// AddPlasmaMethods - the python method definitions |
|
// |
|
|
|
void cyMisc::AddPlasmaMethods4(std::vector<PyMethodDef> &methods) |
|
{ |
|
PYTHON_GLOBAL_METHOD(methods, PtRequestLOSScreen); |
|
|
|
PYTHON_GLOBAL_METHOD(methods, PtKillParticles); |
|
PYTHON_GLOBAL_METHOD(methods, PtGetNumParticles); |
|
PYTHON_GLOBAL_METHOD(methods, PtSetParticleOffset); |
|
|
|
PYTHON_GLOBAL_METHOD(methods, PtSetLightValue); |
|
PYTHON_GLOBAL_METHOD(methods, PtSetLightAnimStart); |
|
|
|
PYTHON_GLOBAL_METHOD_NOARGS(methods, PtIsSinglePlayerMode); |
|
PYTHON_GLOBAL_METHOD_NOARGS(methods, PtIsDemoMode); |
|
PYTHON_GLOBAL_METHOD_NOARGS(methods, PtIsInternalRelease); |
|
PYTHON_GLOBAL_METHOD_NOARGS(methods, PtIsEnterChatModeKeyBound); |
|
|
|
PYTHON_GLOBAL_METHOD(methods, PtShootBulletFromScreen); |
|
PYTHON_GLOBAL_METHOD(methods, PtShootBulletFromObject); |
|
|
|
PYTHON_GLOBAL_METHOD(methods, PtGetPublicAgeList); |
|
PYTHON_GLOBAL_METHOD(methods, PtCreatePublicAge); |
|
PYTHON_GLOBAL_METHOD(methods, PtRemovePublicAge); |
|
|
|
PYTHON_GLOBAL_METHOD(methods, PtSetClearColor); |
|
|
|
PYTHON_GLOBAL_METHOD_NOARGS(methods, PtGetLocalKILevel); |
|
|
|
PYTHON_BASIC_GLOBAL_METHOD(methods, PtClearCameraStack); |
|
PYTHON_GLOBAL_METHOD(methods, PtGetCameraNumber); |
|
PYTHON_GLOBAL_METHOD_NOARGS(methods, PtGetNumCameras); |
|
PYTHON_GLOBAL_METHOD(methods, PtRebuildCameraStack); |
|
PYTHON_BASIC_GLOBAL_METHOD(methods, PtRecenterCamera); |
|
PYTHON_GLOBAL_METHOD_NOARGS(methods, PtFirstPerson); |
|
|
|
PYTHON_GLOBAL_METHOD(methods, PtFadeIn); |
|
PYTHON_GLOBAL_METHOD(methods, PtFadeOut); |
|
|
|
PYTHON_GLOBAL_METHOD(methods, PtSetGlobalClickability); |
|
PYTHON_GLOBAL_METHOD(methods, PtDebugAssert); |
|
PYTHON_GLOBAL_METHOD(methods, PtSetAlarm); |
|
|
|
PYTHON_GLOBAL_METHOD(methods, PtSaveScreenShot); |
|
PYTHON_GLOBAL_METHOD(methods, PtStartScreenCapture); |
|
|
|
PYTHON_GLOBAL_METHOD(methods, PtSendKIGZMarkerMsg); |
|
PYTHON_GLOBAL_METHOD(methods, PtSendKIRegisterImagerMsg); |
|
|
|
PYTHON_GLOBAL_METHOD(methods, PtWearMaintainerSuit); |
|
PYTHON_GLOBAL_METHOD(methods, PtWearDefaultClothing); |
|
|
|
PYTHON_GLOBAL_METHOD_NOARGS(methods, PtGetAgeTimeOfDayPercent); |
|
|
|
PYTHON_GLOBAL_METHOD(methods, PtCheckVisLOS); |
|
PYTHON_GLOBAL_METHOD_NOARGS(methods, PtCheckVisLOSFromCursor); |
|
|
|
PYTHON_GLOBAL_METHOD(methods, PtEnablePlanarReflections); |
|
PYTHON_GLOBAL_METHOD_NOARGS(methods, PtGetSupportedDisplayModes); |
|
PYTHON_GLOBAL_METHOD_NOARGS(methods, PtGetDesktopWidth); |
|
PYTHON_GLOBAL_METHOD_NOARGS(methods, PtGetDesktopHeight); |
|
PYTHON_GLOBAL_METHOD_NOARGS(methods, PtGetDesktopColorDepth); |
|
PYTHON_GLOBAL_METHOD_NOARGS(methods, PtGetDefaultDisplayParams); |
|
PYTHON_GLOBAL_METHOD(methods, PtSetGraphicsOptions); |
|
|
|
PYTHON_GLOBAL_METHOD(methods, PtSetBehaviorNetFlags); |
|
PYTHON_GLOBAL_METHOD(methods, PtSendFriendInvite); |
|
PYTHON_GLOBAL_METHOD_NOARGS(methods, PtGuidGenerate); |
|
PYTHON_GLOBAL_METHOD(methods, PtGetAIAvatarsByModelName); |
|
PYTHON_GLOBAL_METHOD(methods, PtForceVaultNodeUpdate); |
|
PYTHON_GLOBAL_METHOD(methods, PtVaultDownload); |
|
} |