Jump to content

Leaderboard

Popular Content

Showing content with the highest reputation on 03/30/19 in Posts

  1. Hi everyone! Two words about me: My name is Mark. Im working as junior fronted developer. What is this? My open source role play server. I think, it can help some new developers learn and start a project. I'll develop it via github: https://github.com/MarkCavalli/rageserver I will be glad to see any improvements: code review, pull requests, language improvements (My native language is Russian). Also you can quickly connect and test it How to install: https://github.com/MarkCavalli/rageserver Features: Log In/Sign Up Module Server saves player's position on disconnect. (/save) command for development simulate disconnect. MoneyAPI Module -bank account and tax account. - ATMs Character Creator Module Jobs: - Orange Collector Businesses: - Clothing Shops Future plans: - New jobs
    1 point
  2. Hi, This small tuturial how make auto server restart on file change by using webpack. 1. All doing in webpack.config.js file 2. On file top initialize empty variable: let gameServer; 3. In exports object add new plugin (with hook): plugins: [ // ... { apply: compiler => { compiler.hooks.afterEmit.tap('AfterEmitPlugin', () => { // Kill started server if (!!gameServer) { console.log('\nKill game server'); gameServer.kill(); } console.log('\nStart game server'); // Start server gameServer = spawn(path.join(__dirname, 'server.exe')); gameServer.stdout.on('data', data => process.stdout.write(data)); gameServer.stderr.on('data', data => process.stderr.write(data)); }); } } ] 4. Profit
    1 point
  3. We are working on large mapping and placed a lot of objects. And now cant spawn more objects, game says: "max spawn count reached". How to fix this?
    1 point
  4. BUMP any fix for this? added exclusions to my antivirus and windows defender, still nothing
    1 point
  5. В этом топике будет приведен пример добавления некоторых методов в стандартное API RageMP, основной целью этого действа является сокращение кода и ускорение разработки в будущих скриптах. Пример: // За место этого: mp.players.forEach(_player => { _player.outputChatBox("Hello!!!"); }); //Можно будет использовать удобное сокращенное: mp.players.BroadcastMessage("Hello!!!"); Начнём. Создаем в каталоге 'packages/keker' файл 'new-api.js', и сразу же объявим его в 'packages/keker/index.js' добавив туда строку: require('./new-api'); Теперь начнем добавлять наш код в 'new-api.js', начнем с методов для работы с векторами, точнее для вычисления дистанции между ними: mp.Vector3.Distance = function (v1, v2){ return Math.abs(Math.sqrt(Math.pow((v2.x - v1.x),2) + Math.pow((v2.y - v1.y),2)+ Math.pow((v2.z - v1.z),2))); } // функция вычисляющая расстояние между двумя точками в пространстве X;Y;Z; mp.Vector3.Distance2D = function (v1, v2){ return Math.abs(Math.sqrt(Math.pow((v2.x - v1.x),2) + Math.pow((v2.y - v1.y),2))); } // функция вычисляющая расстояние между двумя точками на плоскости X;Y; Теперь их можно вызывать в любом месте вашего кода. Пример: let distance = mp.Vector3.Distance(player.position, player.veh.position); // Вернет расстояние от игрока до его машины в пространстве X;Y;Z let distance = mp.Vector3.Distance2D(player.position, player.veh.position); // Вернет расстояние от игрока до его машины в горизонтальной плоскости X;Y; Теперь добавим в 'new-api.js' методы broadcast'a сообщений и удобного спавна машин: mp.players.BroadcastMessage = function(s, v, d, c){ if(typeof v == 'undefined'){ // если функция вызвана с 1 параметром BroadcastMessage("Wellcome!!!"); this.forEach( player => { player.outputChatBox(s); }); } else if( typeof v == 'string'){ // если функция вызвана с параметром цвета BroadcastMessage("Wellcome!!!", "#ddd"); this.forEach(player => { player.outputChatBox("<font color='"+v+"'>"+s+"</font>"); }); } else if(typeof v == 'object' && typeof d == 'number'){ // если функция вызвана с параметром радиуса действия BroadcastMessage("Wellcome!!!", new mp.Vector3(0, 0, 0), 50); this.forEach(player => { if(Math.pow((player.position.x - v.x), 2) + Math.pow((player.position.y - v.y), 2) + Math.pow((player.position.z - v.z), 2) < Math.pow(d, 2)){ // проверяем находится ли игрок в заданом радиусе if(typeof c == 'string') { // если функция вызвана со всеми параметрами BroadcastMessage("Wellcome!!!", new mp.Vector3(0, 0, 0), 50, "#ddd"); player.outputChatBox("<font color='"+c+"'>"+s+"</font>"); } else { player.outputChatBox(s); } } }); } } // функция выводящая сообщение в чат либо всем игрокам онлайн, либо игрокам находящимся в определенном радиусе, так же позволяет задать цвет текста mp.vehicles.Spawn = function(m, x, y, z){ if(typeof x == 'number' && typeof y == 'number' && typeof z == 'number'){ return this.new(mp.joaat(m), new mp.Vector3(x, y, z)); } else if(typeof x == "object") { return this.new(mp.joaat(m), x); } } // Спавн транспорта в заданной точке, либо по координатам X;Y;Z, возвращает созданый транспорт Их вызов в дальнейшем будет выглядеть так: //за место этого довольно маштабного кода: mp.players.forEach(_player => { _player.outputChatBox("<font color='#ddd'>Hello!!!</font>"); }); // Теперь можно использовать это, эти несколько вариантов mp.players.BroadcastMessage("Hello!!!"); // Разошлет сообщение всем игрокам сервера mp.players.BroadcastMessage("Hello!!!", "#ddd"); // Разошлет сообщение всем игрокам сервера, цвет текста будет #ddd mp.players.BroadcastMessage("Hello!!!", player.position, 50); // Разошлет сообщение всем игрокам в радиусе 50м от текущего, Local Chat mp.players.BroadcastMessage("Hello!!!", player.position, 50, "red"); // Разошлет сообщения всем игрокам в радиусе 50м от текущего, цвет текста красный // Удобный спавн траспорта // За место этого: let veh = mp.vehicles.new(mp.joaat('sultanrs'), new mp.Vector3(200, 14, 25)); // Теперь можно использовать это: let veh = mp.vehicles.Spawn('sultanrs', 200, 14, 25); // Создаст транспорт в указаных координатах, и вернет его в переменную veh //или это: let pos = player.postion; pos.x += 2; let veh = mp.vehicles.Spawn('sultanrs', pos); // Создаст транспорт в указанной точке и вернет его Ну и пару методов для работы с игроком, можно как добавить в 'new-api.js' это: mp.events.add({"playerJoin": player => { player.TeleportTo = function(x, y, z){ if(typeof x == 'object'){ // если первый параметр является вектором this.position = x; } else if(typeof x == 'number' && typeof y == 'number' && typeof z == 'number'){ // если координаты заданы по отдельности this.position = new mp.Vector3(x, y, z); } } // функция телепорта игрока к заданой точке, либо по координатам X;Y;Z; player.Message = function(s, c){ if(typeof s == 'string' && typeof c == 'string'){ // если задан цвет this.outputChatBox("<font color='"+с+"'>"+s+"</font>"); } else if (typeof s == 'string'){ this.outputChatBox(s); } } // функция для быстрой отправки сообщения игроку в чат, с возможностью задать цвет текста } }); Либо вставить код от сюда в 'packages/keker/evens/common.js', вызов этих методов будет выглядеть так: // Телепорт игрока player.TeleportTo(player.veh.position.x-2, player.veh.position.y, player.veh.postion.z); // Телепортирует игрока к точке сбоку от его машины let pos = player.veh.position; pos.x -= 2 player.TeleportTo(pos); // сделает тоже самое только сдесь в функцию передается вектор а не координаты // Удобный вывод сообщений игроку, с возможностью задать цвет текста player.Message("Hello!!!"); // Отправит сообщение в чат игроку player.Message("Hello!!!", "#ddd"); // Отправит сообщение в чат игроку, цвет текста #ddd Ну вот и все, надеюсь, что кому нибудь пригодится!
    1 point
  6. Не могу согласиться. Вызов функции (любой) - это всегда нагрузка на сервер, хоть и мизерная. Но по своему опыту на больших проектах могу сказать, что если вообще не думать о нагрузке на сервер - то в какой-то момент ваше приложение начнёт кушать столько ресурсов, что содержание серверов начнёт стоить вам непосильно много денег (nodejs в особенности подвержена данной проблеме), и вам придётся отрефакторить и переписать половину кода с целью оптимизации, и это займёт кучу драгоценного времени. Лучше сразу думать о том, к чему ваш код может привести. Если в конкретно этой задаче запариться над производительностью и учитывать вероятность асинхрона выполнения `setTimeout` и `setInteval` в nodejs, то можно вот так сделать: // Переменная, куда будет сохраняться setTimeout, чтобы мы могли его очистить по завершению let timer = 0; // Непосредственный callback, который будет выполняться в 00 секунд каждой минуты const changeTime = (currentDate, isFirstRunning) => { // Меняем часы и минуты на сервере mp.environment.time.hour = currentDate.getHours(); mp.environment.time.minute = currentDate.getMinutes(); if (!isFirstRunning) { // Сюда вписываем логику, которая должна выполняться исключительно в 00 секунд каждой минуты } }; // Функция запуска таймера, которая будет отрабатывать в каждые 00 секунд каждой минуты const runTimer = (isFirstRunning) => { // Получаем текущее время // (при каком-то рассинхроне времени в ноде, например, при мелком подвисании сервера, мы синхронизируем время в следующую минуту) const currentDate = new Date(); // Высчитываем оставшееся количество миллисекунд до следующей минуты const remainingMilliseconds = (60 - currentDate.getSeconds()) * 1000 + (1000 - currentDate.getMilliseconds()); // Вызываем callback, который должен выполняться у нас в 00 секунд каждой минуты // (первый запуск будет не в 00 секунд, поэтому мы передаём переменную `isFirstRunning` в callback, // если нам требуется какая-то дополнительная логика на вызов именно в 00 секунд) changeTime(currentDate, !!isFirstRunning); // Очищаем предыдущий таймер - советуют так делать, чтобы избежать утечки памяти clearTimeout(timer); // Сам таймер, который будет запускаться каждый раз timer = setTimeout(() => { runTimer(); }, remainingMilliseconds); }; // Запускаем таймер в первый раз runTimer(true); Чистый код без комментариев, чтобы вы оценили его минималистичность и простоту: let timer = 0; const changeTime = (currentDate, isFirstRunning) => { mp.environment.time.hour = currentDate.getHours(); mp.environment.time.minute = currentDate.getMinutes(); if (isFirstRunning) { // Сюда вписываем логику, которая должна выполняться исключительно в 00 секунд каждой минуты } }; const runTimer = (isFirstRunning) => { const currentDate = new Date(); const remainingMilliseconds = (60 - currentDate.getSeconds()) * 1000 + (1000 - currentDate.getMilliseconds()); changeTime(currentDate, !!isFirstRunning); clearTimeout(timer); timer = setTimeout(() => { runTimer(); }, remainingMilliseconds); }; runTimer(true);
    1 point
  7. setInterval самый нормальный способ создать игровой цикл
    0 points
×
×
  • Create New...