Leaderboard
Popular Content
Showing content with the highest reputation on 01/07/17 in Posts
-
Добавляем в папку `packages/keker/commands` файл `pm.js` со следующим содержанием: findPlayerByIdOrNickname = playerName => { var foundPlayer = null; // Проверяем, число ли это if (playerName == parseInt(playerName)) { // Если число - ищем среди ID'ов пользователей foundPlayer = mp.players.at(playerName); } // Если пользователь не найден по ID - ищем по никам if (!foundPlayer) { mp.players.forEach((_player) => { if (_player.name === playerName) { foundPlayer = _player; } }); } return foundPlayer; }; module.exports = { // Добавляем команду `/pm` "pm": (player, args) => { // Проверяем корректность введённой команды if (args.length < 3 || !args[1].length || !args[2].length) { // Если что-то в команде было введено не так, то выводим соответствующее сообщение player.outputChatBox('Для отправки личного сообщения введите:<br /><b>/pm [id_получателя_или_ник] [текст сообщения]</b>'); return false; } // Ищем пользователя по иду или нику среди всех пользователей сервера const recipient = findPlayerByIdOrNickname(args[1]); // Если пользователь не найден, то выводим соответствующее сообщение if (!recipient) { player.outputChatBox('<b>Указанный пользователь не найден в игре</b>'); return false; } // Собираем текст сообщения из агрументов, игнорируя команду `/pm` и ид/ник получателя в аргументах const message = args.slice(2).join(' '); // Генерируем строку для чата в формате: // [PM] Ник_Отправителя[ID_Отправителя] -> Ник_Получателя[ID_Получателя]: Текст сообщения const str = `<b>[PM] ${player.name}[${player.id}] -> ${recipient.name}[${recipient.id}]</b>: ${message}`; // Отправляем сообщение в чат получателю recipient.outputChatBox(str); // Отправляем сообщение в чат отправителю player.outputChatBox(str); } }; Теперь если пользователь введёт команду: /pm [ид_или_ник_игрока] [текст сообщения] будет отправляться личное сообщение указанному игроку. Примеры: ВАЖНО: Требуется сохранить файл pm.js в кодировке UTF-8 (Unicode), т.к. в нём присутствует кириллица! Иначе все системные сообщения, написанные на русском, в игре будут отображаться знаками вопроса вместо букв.1 point
-
Топовый проект, с топовыми режимами, с топовыми возможностями и топовыми игроками. Rage Complex - запланирован как мультирежимный проект, планирующий включить на одном сервере несколько игровых режимов, и сотни игроков. Ты сможешь свободно кататься по Лос Сантосу, принимать участие в режиме захвата точек, а потом проехать несколько гонок. Конечно, на данный момент написанное выше является нашей мечтой, но мы уверены в том, что со временем - у нас получится реализовать всё запланированное. В нашей команде имеются разработчики разного класса и с различным стажем за плечами, поэтому рук будет достаточно. В данный момент у нас запущен и время от времени дорабатывается сервер 'Complex' Freeroam, который уже успел отличиться среди остальных серверов, как в RAGE MP 0.1, так и в RAGE MP 0.3. А так же, он полюбился большой аудитории. RAGE:MP 'Complex' Freeroam: 178.170.189.252:22005 или SERVER.RAGEMP.RU:22005 https://vk.com/ragecomplex Что мы хотим сделать в ближайшем будущем? Аккаунты и статистика игроков. Уровень и опыт. Team Deathmatch, режим командных боёв. Что мы хотим сделать в общем? Крутой и уникальный игровой режим, который сможет понравиться десяткам людей и не оставит новичков равнодушными. Кучу разнообразных режимов, в которых вы сможете делать всё - к чему лежит безумная душа. Как мы это хотим сделать? Ручками, сэр, ручками. Архив (когда-то он будет в прямом смысле "Архивом"). Присоединяйтесь к нам! Развивайтесь вместе с нами! И тогда мы вместе будем творить историю Complex!1 point
-
Create file `pm.js` to directory `packages/keker/commands` with the following code: findPlayerByIdOrNickname = playerName => { let foundPlayer = null; // If playerName is numberic if (playerName == parseInt(playerName)) { // search player by ID foundPlayer = mp.players.at(playerName); } // or search player by nickname if (!foundPlayer) { mp.players.forEach((_player) => { if (_player.name === playerName) { foundPlayer = _player; } }); } return foundPlayer; }; module.exports = { // Add command `/pm` "pm": (player, args) => { // Check args if (args.length < 3 || !args[1].length || !args[2].length) { player.outputChatBox('Valid syntax: <b>/pm [recipient_id_or_nickname] [text_message]</b>'); return false; } // Search recipient by second argument const recipient = findPlayerByIdOrNickname(args[1]); // If recipient not found show special message if (!recipient) { player.outputChatBox('<b>User not found</b>'); return false; } // Source message const message = args.slice(2).join(' '); // Generate chat string in the following format: // [PM] Sender_Nickname[Sender_Id] -> Recipient_Nickname[Recipient_Id]: Text message const str = `<b>[PM] ${player.name}[${player.id}] -> ${recipient.name}[${recipient.id}]</b>: ${message}`; // Send message to recipient recipient.outputChatBox(str); // Send message to sender player.outputChatBox(str); } }; Now if you write in the chat: `/pm [id_or_nickname] [text_message]` you send the private message.1 point
-
Create file `monitoring.js` to directory `packages/keker` with the following code: // Require nodejs module `http` const http = require('http'); // Create web server const server = http.createServer(function(request, response) { // Show monitoring for any request response.writeHead(200, {"Content-Type": "text/html"}); response.write(`<br>Players: ${mp.players.length}/${mp.players.size}`); response.write(`<br>Uptime: ${process.uptime()}`); response.end(); }); // Turn on the web server on the port 8080 // (you can change it to any port) server.listen(8080); // Show message in terminal about successful starting of Monitoring Server console.log('\nMonitoring Server is listening'); Append to file `packages/keker/index.js` the following code: require('./monitoring'); Now when you open url http://your_ip:8080 you see the following data: Also you can change the port of web server in `monitoring.js`. And you can change the data format to JSON if you need.1 point
-
Где найти информацию по созданию гуи ? Понемногу создаю свой рп мод но сейчас нужно реализовать отображение кол-ва топлива1 point
-
1 point
-
Не могу согласиться. Вызов функции (любой) - это всегда нагрузка на сервер, хоть и мизерная. Но по своему опыту на больших проектах могу сказать, что если вообще не думать о нагрузке на сервер - то в какой-то момент ваше приложение начнёт кушать столько ресурсов, что содержание серверов начнёт стоить вам непосильно много денег (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
-
Присоединяюсь к вопросу. Но вообще тот же чат сделан на CEF, его реализацию можно увидеть в клиенте, но конечно хотелось бы мануалов.1 point
-
Да, ведь нужно чтобы тема была вся в разных цветах разными шрифтами. Те, кто играл на нашем проекте, знают что и как и нам этого достаточно. Что касается сайта, не вижу смысла тратить деньги на оплату хостинга, пока даже разработка мода не началась. Мы шарим за РП с 2012 года, и были на таких проектах как: Classic RP, Just RP, Original RP, Vicious RP, Valence, SW Project не только как обычные игроки.1 point
-
1 point
-
1 point
-
Прозвучит грубо, и скорее всего это сообщение адресовано не лично тебе а каждому одинокому рейнджеру который собирает команду. Расскажу небольшую байку: - собрались комьюнити менеджер, тестеры, дизайнер и два скриптера и собственно задались вопросом; - а ты нам зачем тогда сдался?; Не принимай близко к сердцу - но так оно и есть, если ты не имеешь умений вышеописанных членов команды, зачем тогда кому-то присоединяться к тебе?1 point
-
NPC конечно же нужны, это очень влияющий на онлайн, да и на сам мультиплеер в общем фактор1 point
-
Площадь карты GTA:sa - 36кв. километров , площадь Gta:V - 126кв. километров (в 3.5 раза больше). Часто встречал игроков на серверах samp не находясь на часто посещаемых местах? Конечно-же нет. Карта была настолько безлюдной что если-бы не встречи на заводе и шахте казалось бы что играешь в dayz.1 point
