Some work

This commit is contained in:
KimLS 2017-04-22 16:40:01 -07:00
parent 4d39c76c19
commit 3b62cf9fd5
5 changed files with 127 additions and 14 deletions

View File

@ -103,6 +103,7 @@ SET(common_sources
tinyxml/tinyxml.cpp tinyxml/tinyxml.cpp
tinyxml/tinyxmlerror.cpp tinyxml/tinyxmlerror.cpp
tinyxml/tinyxmlparser.cpp tinyxml/tinyxmlparser.cpp
util/directory.cpp
util/uuid.cpp util/uuid.cpp
) )
@ -257,6 +258,7 @@ SET(common_headers
tinyxml/tinystr.h tinyxml/tinystr.h
tinyxml/tinyxml.h tinyxml/tinyxml.h
util/memory_stream.h util/memory_stream.h
util/directory.h
util/uuid.h util/uuid.h
) )
@ -366,6 +368,8 @@ SOURCE_GROUP(TinyXML FILES
SOURCE_GROUP(Util FILES SOURCE_GROUP(Util FILES
util/memory_stream.h util/memory_stream.h
util/directory.cpp
util/directory.h
util/uuid.cpp util/uuid.cpp
util/uuid.h util/uuid.h
) )

View File

@ -31,6 +31,7 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#include "water_map.h" #include "water_map.h"
#include "worldserver.h" #include "worldserver.h"
#include "zone.h" #include "zone.h"
#include "lua_parser.h"
#include <assert.h> #include <assert.h>
#include <stdio.h> #include <stdio.h>
@ -1237,6 +1238,15 @@ void Mob::DoAttack(Mob *other, DamageHitInfo &hit, ExtraAttackOptions *opts)
return; return;
Log(Logs::Detail, Logs::Combat, "%s::DoAttack vs %s base %d min %d offense %d tohit %d skill %d", GetName(), Log(Logs::Detail, Logs::Combat, "%s::DoAttack vs %s base %d min %d offense %d tohit %d skill %d", GetName(),
other->GetName(), hit.base_damage, hit.min_damage, hit.offense, hit.tohit, hit.skill); other->GetName(), hit.base_damage, hit.min_damage, hit.offense, hit.tohit, hit.skill);
#ifdef LUA_EQEMU
try {
LuaParser::Instance()->DoAttack(this, other, hit, opts);
} catch(IgnoreDefaultException) {
return;
}
#endif
// check to see if we hit.. // check to see if we hit..
if (other->AvoidDamage(this, hit)) { if (other->AvoidDamage(this, hit)) {
int strike_through = itembonuses.StrikeThrough + spellbonuses.StrikeThrough + aabonuses.StrikeThrough; int strike_through = itembonuses.StrikeThrough + spellbonuses.StrikeThrough + aabonuses.StrikeThrough;

View File

@ -10,8 +10,14 @@
#include <vector> #include <vector>
#include <algorithm> #include <algorithm>
#include "masterentity.h"
#include "../common/spdat.h" #include "../common/spdat.h"
#include "../common/util/directory.h"
#include "masterentity.h"
#include "questmgr.h"
#include "zone.h"
#include "zone_config.h"
#include "lua_parser.h"
#include "lua_bit.h" #include "lua_bit.h"
#include "lua_entity.h" #include "lua_entity.h"
#include "lua_item.h" #include "lua_item.h"
@ -31,10 +37,6 @@
#include "lua_spawn.h" #include "lua_spawn.h"
#include "lua_packet.h" #include "lua_packet.h"
#include "lua_general.h" #include "lua_general.h"
#include "questmgr.h"
#include "zone.h"
#include "zone_config.h"
#include "lua_parser.h"
#include "lua_encounter.h" #include "lua_encounter.h"
const char *LuaEvents[_LargestEventID] = { const char *LuaEvents[_LargestEventID] = {
@ -135,6 +137,75 @@ std::map<std::string, std::list<lua_registered_event>> lua_encounter_events_regi
std::map<std::string, bool> lua_encounters_loaded; std::map<std::string, bool> lua_encounters_loaded;
std::map<std::string, Encounter *> lua_encounters; std::map<std::string, Encounter *> lua_encounters;
void LuaParser::DoAttack(Mob *self, Mob *other, DamageHitInfo &hit, ExtraAttackOptions *opts)
{
int start = lua_gettop(L);
bool ignoreDefault = false;
for (auto &mod : mods_) {
try {
lua_getfield(L, LUA_REGISTRYINDEX, mod.c_str());
lua_getfield(L, -1, "DoAttack");
Lua_Mob l_self(self);
Lua_Mob l_other(other);
luabind::adl::object e = luabind::newtable(L);
luabind::adl::object lua_hit = luabind::newtable(L);
lua_hit["base_damage"] = hit.base_damage;
lua_hit["damage_done"] = hit.damage_done;
lua_hit["offense"] = hit.offense;
lua_hit["tohit"] = hit.tohit;
lua_hit["hand"] = hit.hand;
lua_hit["skill"] = (int)hit.skill;
e["self"] = luabind::adl::object(L, l_self);
e["other"] = luabind::adl::object(L, l_other);
e["hit"] = lua_hit;
if (opts) {
luabind::adl::object lua_opts = luabind::newtable(L);
lua_opts["damage_percent"] = opts->damage_percent;
lua_opts["damage_flat"] = opts->damage_flat;
lua_opts["armor_pen_percent"] = opts->armor_pen_percent;
lua_opts["armor_pen_flat"] = opts->armor_pen_flat;
lua_opts["crit_percent"] = opts->crit_percent;
lua_opts["crit_flat"] = opts->crit_flat;
lua_opts["hate_percent"] = opts->hate_percent;
lua_opts["hate_flat"] = opts->hate_flat;
lua_opts["hit_chance"] = opts->hit_chance;
lua_opts["melee_damage_bonus_flat"] = opts->melee_damage_bonus_flat;
lua_opts["skilldmgtaken_bonus_flat"] = opts->skilldmgtaken_bonus_flat;
e["opts"] = lua_opts;
}
else {
e["opts"] = luabind::nil;
}
e.push(L);
if (lua_pcall(L, 1, 1, 0)) {
std::string error = lua_tostring(L, -1);
AddError(error);
}
}
catch (std::exception &ex) {
std::string error = "Lua Exception: ";
error += std::string(ex.what());
AddError(error);
}
int end = lua_gettop(L);
int n = end - start;
if (n > 0) {
lua_pop(L, n);
}
}
if (ignoreDefault) {
throw IgnoreDefaultException();
}
}
LuaParser::LuaParser() { LuaParser::LuaParser() {
for(int i = 0; i < _LargestEventID; ++i) { for(int i = 0; i < _LargestEventID; ++i) {
NPCArgumentDispatch[i] = handle_npc_null; NPCArgumentDispatch[i] = handle_npc_null;
@ -797,6 +868,7 @@ void LuaParser::Init() {
void LuaParser::ReloadQuests() { void LuaParser::ReloadQuests() {
loaded_.clear(); loaded_.clear();
errors_.clear(); errors_.clear();
mods_.clear();
lua_encounter_events_registered.clear(); lua_encounter_events_registered.clear();
lua_encounters_loaded.clear(); lua_encounters_loaded.clear();
@ -828,7 +900,7 @@ void LuaParser::ReloadQuests() {
#ifdef SANITIZE_LUA_LIBS #ifdef SANITIZE_LUA_LIBS
//io //io
lua_pushnil(L); lua_pushnil(L);
lua_setglobal(L, "io"); //lua_setglobal(L, "io");
//some os/debug are okay some are not //some os/debug are okay some are not
lua_getglobal(L, "os"); lua_getglobal(L, "os");
@ -949,6 +1021,17 @@ void LuaParser::ReloadQuests() {
} }
} }
} }
EQ::Directory dir("mods");
std::vector<std::string> mods;
dir.GetFiles(mods);
for (auto &mod : mods) {
if (mod.find_first_of(".lua") != std::string::npos) {
LoadScript("mods/" + mod, mod);
mods_.push_back(mod);
}
}
} }
void LuaParser::LoadScript(std::string filename, std::string package_name) { void LuaParser::LoadScript(std::string filename, std::string package_name) {

View File

@ -7,6 +7,7 @@
#include <string> #include <string>
#include <list> #include <list>
#include <map> #include <map>
#include <exception>
#include "zone_config.h" #include "zone_config.h"
@ -30,9 +31,17 @@ namespace luabind {
} }
} }
class IgnoreDefaultException : std::exception {
public:
IgnoreDefaultException() { };
IgnoreDefaultException(const exception&) { };
IgnoreDefaultException& operator= (const exception&) { return *this; }
virtual ~IgnoreDefaultException() { }
virtual const char* what() const { return "Ignore Default Action"; }
};
class LuaParser : public QuestInterface { class LuaParser : public QuestInterface {
public: public:
LuaParser();
~LuaParser(); ~LuaParser();
virtual int EventNPC(QuestEventID evt, NPC* npc, Mob *init, std::string data, uint32 extra_data, virtual int EventNPC(QuestEventID evt, NPC* npc, Mob *init, std::string data, uint32 extra_data,
@ -81,7 +90,19 @@ public:
virtual int DispatchEventSpell(QuestEventID evt, NPC* npc, Client *client, uint32 spell_id, uint32 extra_data, virtual int DispatchEventSpell(QuestEventID evt, NPC* npc, Client *client, uint32 spell_id, uint32 extra_data,
std::vector<EQEmu::Any> *extra_pointers); std::vector<EQEmu::Any> *extra_pointers);
static LuaParser* Instance() {
static LuaParser inst;
return &inst;
}
//Mod Extensions
void DoAttack(Mob *self, Mob *other, DamageHitInfo &hit, ExtraAttackOptions *opts);
private: private:
LuaParser();
LuaParser(const LuaParser&);
LuaParser& operator=(const LuaParser&);
int _EventNPC(std::string package_name, QuestEventID evt, NPC* npc, Mob *init, std::string data, uint32 extra_data, int _EventNPC(std::string package_name, QuestEventID evt, NPC* npc, Mob *init, std::string data, uint32 extra_data,
std::vector<EQEmu::Any> *extra_pointers, luabind::adl::object *l_func = nullptr); std::vector<EQEmu::Any> *extra_pointers, luabind::adl::object *l_func = nullptr);
int _EventPlayer(std::string package_name, QuestEventID evt, Client *client, std::string data, uint32 extra_data, int _EventPlayer(std::string package_name, QuestEventID evt, Client *client, std::string data, uint32 extra_data,
@ -95,12 +116,12 @@ private:
void LoadScript(std::string filename, std::string package_name); void LoadScript(std::string filename, std::string package_name);
bool HasFunction(std::string function, std::string package_name); bool HasFunction(std::string function, std::string package_name);
void ClearStates();
void MapFunctions(lua_State *L); void MapFunctions(lua_State *L);
QuestEventID ConvertLuaEvent(QuestEventID evt); QuestEventID ConvertLuaEvent(QuestEventID evt);
std::map<std::string, std::string> vars_; std::map<std::string, std::string> vars_;
std::map<std::string, bool> loaded_; std::map<std::string, bool> loaded_;
std::vector<std::string> mods_;
lua_State *L; lua_State *L;
NPCArgumentHandler NPCArgumentDispatch[_LargestEventID]; NPCArgumentHandler NPCArgumentDispatch[_LargestEventID];

View File

@ -391,8 +391,7 @@ int main(int argc, char** argv) {
parse = new QuestParserCollection(); parse = new QuestParserCollection();
#ifdef LUA_EQEMU #ifdef LUA_EQEMU
auto lua_parser = new LuaParser(); parse->RegisterQuestInterface(LuaParser::Instance(), "lua");
parse->RegisterQuestInterface(lua_parser, "lua");
#endif #endif
#ifdef EMBPERL #ifdef EMBPERL
@ -565,10 +564,6 @@ int main(int argc, char** argv) {
safe_delete(perl_parser); safe_delete(perl_parser);
#endif #endif
#ifdef LUA_EQEMU
safe_delete(lua_parser);
#endif
safe_delete(Config); safe_delete(Config);
if (zone != 0) if (zone != 0)