SMJS_Plugin *LoadPlugin(const char *dir){ auto plugin = SMJS_Plugin::GetPluginByDir(dir); if(plugin != NULL) return plugin; bool isSandboxed = true; for(auto it = trustedPlugins.begin(); it != trustedPlugins.end(); ++it){ if(strcmp(dir, it->c_str()) == 0){ isSandboxed = false; break; } } plugin = new SMJS_Plugin(isSandboxed); char path[512]; smutils->BuildPath(Path_SM, path, sizeof(path), "plugins.js/%s", dir); plugin->SetDir(dir); plugin->SetPath(path); plugin->LoadModules(); plugin->CheckApi(); if(!plugin->LoadFile("Main.js", true)){ delete plugin; return NULL; } // Late loading if(smutils->IsMapRunning()){ HandleScope handle_scope(plugin->GetIsolate()); Context::Scope context_scope(plugin->GetContext()); auto hooks = plugin->GetHooks("OnMapStart"); for(auto it = hooks->begin(); it != hooks->end(); ++it){ (*it)->Call(plugin->GetContext()->Global(), 0, NULL); } for(int i = 0; i < sizeof(clients) / sizeof(clients[0]); ++i){ if(clients[i] == NULL) continue; v8::Handle<v8::Value> arg = clients[i]->GetWrapper(plugin); hooks = plugin->GetHooks("OnClientConnected"); for(auto it = hooks->begin(); it != hooks->end(); ++it){ (*it)->Call(plugin->GetContext()->Global(), 1, &arg); } if(clients[i]->inGame){ hooks = plugin->GetHooks("OnClientPutInGame"); for(auto it = hooks->begin(); it != hooks->end(); ++it){ (*it)->Call(plugin->GetContext()->Global(), 1, &arg); } } } } return plugin; }
std::vector<v8::Persistent<v8::Function>>* SMJS_Plugin::GetHooks(char const *type){ std::string typeStd(type); auto it = hooks.find(typeStd); if(it != hooks.end()){ return &it->second; } hooks.insert(std::make_pair(typeStd, std::vector<v8::Persistent<v8::Function>>())); auto vec = GetHooks(type); HandleScope handle_scope(isolate); Context::Scope context_scope(context); auto g = context->Global()->Get(v8::String::New(type)); if(!g.IsEmpty() && g->IsFunction()){ vec->push_back(v8::Persistent<v8::Function>::New(v8::Local<v8::Function>::Cast(g))); } return vec; }