string CLuaHandle::GetTooltip(int x, int y) { if (!CheckModUICtrl()) { return ""; } LUA_CALL_IN_CHECK(L); lua_checkstack(L, 4); static const LuaHashString cmdStr("GetTooltip"); if (!PushUnsyncedCallIn(cmdStr)) { return ""; // the call is not defined } lua_pushnumber(L, x - gu->viewPosX); lua_pushnumber(L, gu->viewSizeY - y - 1); // call the function if (!RunCallInUnsynced(cmdStr, 2, 1)) { return ""; } if (!lua_isstring(L, -1)) { lua_pop(L, 1); return ""; } const string retval = lua_tostring(L, -1); lua_pop(L, 1); return retval; }
bool CLuaHandle::MouseWheel(bool up, float value) { if (!CheckModUICtrl()) { return false; } LUA_CALL_IN_CHECK(L); lua_checkstack(L, 4); static const LuaHashString cmdStr("MouseWheel"); if (!PushUnsyncedCallIn(cmdStr)) { return false; // the call is not defined, do not take the event } lua_pushboolean(L, up); lua_pushnumber(L, value); // call the function if (!RunCallInUnsynced(cmdStr, 2, 1)) { return false; } if (!lua_isboolean(L, -1)) { lua_pop(L, 1); return false; } const bool retval = !!lua_toboolean(L, -1); lua_pop(L, 1); return retval; }
bool CLuaHandle::IsAbove(int x, int y) { if (!CheckModUICtrl()) { return false; } LUA_CALL_IN_CHECK(L); lua_checkstack(L, 4); static const LuaHashString cmdStr("IsAbove"); if (!PushUnsyncedCallIn(cmdStr)) { return false; // the call is not defined } lua_pushnumber(L, x - gu->viewPosX); lua_pushnumber(L, gu->viewSizeY - y - 1); // call the function if (!RunCallInUnsynced(cmdStr, 2, 1)) { return false; } if (!lua_isboolean(L, -1)) { lua_pop(L, 1); return false; } const bool retval = !!lua_toboolean(L, -1); lua_pop(L, 1); return retval; }
bool CLuaHandle::MouseMove(int x, int y, int dx, int dy, int button) { if (!CheckModUICtrl()) { return false; } LUA_CALL_IN_CHECK(L); lua_checkstack(L, 7); static const LuaHashString cmdStr("MouseMove"); if (!PushUnsyncedCallIn(cmdStr)) { return false; // the call is not defined, do not take the event } lua_pushnumber(L, x - gu->viewPosX); lua_pushnumber(L, gu->viewSizeY - y - 1); lua_pushnumber(L, dx); lua_pushnumber(L, -dy); lua_pushnumber(L, button); // call the function if (!RunCallInUnsynced(cmdStr, 5, 1)) { return false; } if (!lua_isboolean(L, -1)) { lua_pop(L, 1); return false; } const bool retval = !!lua_toboolean(L, -1); lua_pop(L, 1); return retval; }
int CLuaHandle::MouseRelease(int x, int y, int button) { if (!CheckModUICtrl()) { return false; } LUA_CALL_IN_CHECK(L); lua_checkstack(L, 5); static const LuaHashString cmdStr("MouseRelease"); if (!PushUnsyncedCallIn(cmdStr)) { return false; // the call is not defined, do not take the event } lua_pushnumber(L, x - gu->viewPosX); lua_pushnumber(L, gu->viewSizeY - y - 1); lua_pushnumber(L, button); // call the function if (!RunCallInUnsynced(cmdStr, 3, 1)) { return false; } if (!lua_isnumber(L, -1)) { lua_pop(L, 1); return -1; } const int retval = lua_toint(L, -1) - 1; lua_pop(L, 1); return retval; }
string CLuaHandle::WorldTooltip(const CUnit* unit, const CFeature* feature, const float3* groundPos) { if (!CheckModUICtrl()) { return ""; } LUA_CALL_IN_CHECK(L); lua_checkstack(L, 6); static const LuaHashString cmdStr("WorldTooltip"); if (!PushUnsyncedCallIn(cmdStr)) { return ""; // the call is not defined } int args; if (unit) { HSTR_PUSH(L, "unit"); lua_pushnumber(L, unit->id); args = 2; } else if (feature) { HSTR_PUSH(L, "feature"); lua_pushnumber(L, feature->id); args = 2; } else if (groundPos) { HSTR_PUSH(L, "ground"); lua_pushnumber(L, groundPos->x); lua_pushnumber(L, groundPos->y); lua_pushnumber(L, groundPos->z); args = 4; } else { HSTR_PUSH(L, "selection"); args = 1; } // call the routine if (!RunCallInUnsynced(cmdStr, args, 1)) { return ""; } if (!lua_isstring(L, -1)) { lua_pop(L, 1); return ""; } const string retval = lua_tostring(L, -1); lua_pop(L, 1); return retval; }
bool CLuaHandle::CommandNotify(const Command& cmd) { if (!CheckModUICtrl()) { return false; } LUA_CALL_IN_CHECK(L); lua_checkstack(L, 5); static const LuaHashString cmdStr("CommandNotify"); if (!PushUnsyncedCallIn(cmdStr)) { return false; // the call is not defined } // push the command id lua_pushnumber(L, cmd.id); // push the params list lua_newtable(L); for (int p = 0; p < (int)cmd.params.size(); p++) { lua_pushnumber(L, p + 1); lua_pushnumber(L, cmd.params[p]); lua_rawset(L, -3); } // push the options table lua_newtable(L); HSTR_PUSH_NUMBER(L, "coded", cmd.options); HSTR_PUSH_BOOL(L, "alt", !!(cmd.options & ALT_KEY)); HSTR_PUSH_BOOL(L, "ctrl", !!(cmd.options & CONTROL_KEY)); HSTR_PUSH_BOOL(L, "shift", !!(cmd.options & SHIFT_KEY)); HSTR_PUSH_BOOL(L, "right", !!(cmd.options & RIGHT_MOUSE_KEY)); HSTR_PUSH_BOOL(L, "meta", !!(cmd.options & META_KEY)); // call the function if (!RunCallInUnsynced(cmdStr, 3, 1)) { return false; } // get the results if (!lua_isboolean(L, -1)) { logOutput.Print("CommandNotify() bad return value\n"); lua_pop(L, 1); return false; } const bool retval = !!lua_toboolean(L, -1); lua_pop(L, 1); return retval; }
bool CLuaHandle::GameSetup(const string& state, bool& ready, const map<int, string>& playerStates) { if (!CheckModUICtrl()) { return false; } LUA_CALL_IN_CHECK(L); lua_checkstack(L, 5); static const LuaHashString cmdStr("GameSetup"); if (!PushUnsyncedCallIn(cmdStr)) { return false; } lua_pushstring(L, state.c_str()); lua_pushboolean(L, ready); lua_newtable(L); map<int, string>::const_iterator it; for (it = playerStates.begin(); it != playerStates.end(); ++it) { lua_pushnumber(L, it->first); lua_pushstring(L, it->second.c_str()); lua_rawset(L, -3); } // call the routine if (!RunCallInUnsynced(cmdStr, 3, 2)) { return false; } if (lua_isboolean(L, -2)) { if (lua_toboolean(L, -2)) { if (lua_isboolean(L, -1)) { ready = lua_toboolean(L, -1); } lua_pop(L, 2); return true; } } lua_pop(L, 2); return false; }
bool CLuaHandle::ConfigCommand(const string& command) { if (!CheckModUICtrl()) { return true; // FIXME ? } LUA_CALL_IN_CHECK(L); lua_checkstack(L, 2); static const LuaHashString cmdStr("ConfigureLayout"); if (!PushUnsyncedCallIn(cmdStr)) { return true; // the call is not defined } lua_pushstring(L, command.c_str()); // call the routine if (!RunCallInUnsynced(cmdStr, 1, 0)) { return false; } return true; }
bool CLuaHandle::KeyPress(unsigned short key, bool isRepeat) { if (!CheckModUICtrl()) { return false; } LUA_CALL_IN_CHECK(L); lua_checkstack(L, 6); static const LuaHashString cmdStr("KeyPress"); if (!PushUnsyncedCallIn(cmdStr)) { return false; // the call is not defined, do not take the event } lua_pushnumber(L, key); lua_newtable(L); HSTR_PUSH_BOOL(L, "alt", !!keys[SDLK_LALT]); HSTR_PUSH_BOOL(L, "ctrl", !!keys[SDLK_LCTRL]); HSTR_PUSH_BOOL(L, "meta", !!keys[SDLK_LMETA]); HSTR_PUSH_BOOL(L, "shift", !!keys[SDLK_LSHIFT]); lua_pushboolean(L, isRepeat); CKeySet ks(key, false); lua_pushstring(L, ks.GetString(true).c_str()); lua_pushnumber(L, currentUnicode); // call the function if (!RunCallInUnsynced(cmdStr, 5, 1)) { return false; } // const int args = lua_gettop(L); unused if (!lua_isboolean(L, -1)) { lua_pop(L, 1); return false; } const bool retval = !!lua_toboolean(L, -1); lua_pop(L, 1); return retval; }
bool CLuaHandle::GroupChanged(int groupID) { if (!CheckModUICtrl()) { return false; } LUA_CALL_IN_CHECK(L); lua_checkstack(L, 3); static const LuaHashString cmdStr("GroupChanged"); if (!PushUnsyncedCallIn(cmdStr)) { return false; // the call is not defined } lua_pushnumber(L, groupID); // call the routine if (!RunCallInUnsynced(cmdStr, 1, 0)) { return false; } return true; }
bool CLuaHandle::AddConsoleLine(const string& msg, int zone) { if (!CheckModUICtrl()) { return true; // FIXME? } LUA_CALL_IN_CHECK(L); lua_checkstack(L, 4); static const LuaHashString cmdStr("AddConsoleLine"); if (!PushUnsyncedCallIn(cmdStr)) { return true; // the call is not defined } lua_pushstring(L, msg.c_str()); lua_pushnumber(L, zone); // call the function if (!RunCallIn(cmdStr, 2, 0)) { return false; } return true; }
bool CLuaHandle::AddConsoleLine(const string& msg, const CLogSubsystem& /**/) { if (!CheckModUICtrl()) { return true; // FIXME? } LUA_CALL_IN_CHECK(L); lua_checkstack(L, 4); static const LuaHashString cmdStr("AddConsoleLine"); if (!PushUnsyncedCallIn(cmdStr)) { return true; // the call is not defined } lua_pushstring(L, msg.c_str()); // FIXME: makes no sense now, but *gets might expect this lua_pushnumber(L, 0); // call the function if (!RunCallIn(cmdStr, 2, 0)) { return false; } return true; }
bool CLuaHandle::MapDrawCmd(int playerID, int type, const float3* pos0, const float3* pos1, const string* label) { if (!CheckModUICtrl()) { return false; } LUA_CALL_IN_CHECK(L); lua_checkstack(L, 9); static const LuaHashString cmdStr("MapDrawCmd"); if (!PushUnsyncedCallIn(cmdStr)) { return false; // the call is not defined } int args; lua_pushnumber(L, playerID); if (type == CInMapDraw::NET_POINT) { HSTR_PUSH(L, "point"); lua_pushnumber(L, pos0->x); lua_pushnumber(L, pos0->y); lua_pushnumber(L, pos0->z); lua_pushstring(L, label->c_str()); args = 6; } else if (type == CInMapDraw::NET_LINE) { HSTR_PUSH(L, "line"); lua_pushnumber(L, pos0->x); lua_pushnumber(L, pos0->y); lua_pushnumber(L, pos0->z); lua_pushnumber(L, pos1->x); lua_pushnumber(L, pos1->y); lua_pushnumber(L, pos1->z); args = 8; } else if (type == CInMapDraw::NET_ERASE) { HSTR_PUSH(L, "erase"); lua_pushnumber(L, pos0->x); lua_pushnumber(L, pos0->y); lua_pushnumber(L, pos0->z); lua_pushnumber(L, 100.0f); // radius args = 6; } else { logOutput.Print("Unknown MapDrawCmd() type"); lua_pop(L, 2); // pop the function and playerID return false; } // call the routine if (!RunCallInUnsynced(cmdStr, args, 1)) { return false; } // take the event? if (!lua_isboolean(L, -1)) { lua_pop(L, 1); return false; } const bool retval = lua_toboolean(L, -1); lua_pop(L, 1); return retval; }