Esempio n. 1
0
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;
}
Esempio n. 2
0
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;
}