You are not logged in.
[offtop]009 - ты тот самый Alex009, который сделал ботов в 0.2x?) Я как раз тут нарыл исходник сампа 0.2.5, испытывать не с кем, а боты бы пригодились [/offtop]
Чем больше ты будешь наворачивать бота, тем больше это будет упираться в функционал игры, так что мне кажется, что не обойдется без использования самой игры. Можно посмотреть готовые опен-сорс проекты с ботами или даже, например, в утекших исходниках Source, для помощи в разработке алгоритмов самих ботов.
Да, тот самый. На 0.2х были первые попытки, готовый результат был в 0.3.
Идея такого развития плагина пока не сдвинулась с мертвой точки. Учитывая что нужно поддержку и линукса и винды - игру подцепить не вариант. Остается только сделать свою реализацию обработки физики для ботов и интеллекта.
@DK22Pac - простая реализация алгоритма дейкстры для нахождения по пути по графу (граф дан - все пути игры **NODES.dat)
Вот как раз для использования самого интеллекта ботов игры и хотел подключить её, но потом вспомнил про unix версию сервера и идея сгорела. На данный момент боты и так умеют выполнять простенькие функции, "верх" их действий - нахождение кратчайшего пути по графу путей игры и движение по нему. Но когда нужно устроить перестрелку ботов и игроков - этого крайне мало. Получаем глупые столбы, которые стреляют по координатам, даже если между ними и целью стена. Осталась только мысль с загрузкой физической модели мира игры и писать обработку физики для ботов. Дело может и интересное, но времени требует много.
на счет P.S. : функционал стандартных ботов скуден, и их максимум - расставить торговцев по городу, либо заставить кататься по записи автобуса по городу.
функционал моего плагина - link
функционал стандартных ботов - link
Здравствуйте.
Я разрабатываю плагин ботов для мультиплеера SA-MP. На сервере не содержится никакой информации о игровом мире, по сути он просто посредник между клиентами, а клиенты получая данные (координаты позиции, взгляда, и подобное) применяют эти данные себе, и уже локально идет обработка физических столкновений и прочего. Но боты - не игроки, у них нет экземпляра игры, который обработал бы данные аналогично обычным игрокам. Это вызывает ряд проблем - боты не имеют интеллект (имеется ввиду, что нельзя создать бота подобно тому, какой создается в одиночной игре), они не "знают" физическую модель мира (спокойно проходят сквозь стены, для них это не проблема), определение попаданий в ботов так же сильно упрощено - проверка проходит ли луч прицеливания через бота (нет учета разброса выстрелов, препятствия между стреляющим и целью) и подобное. Некоторое время назад, я работал над мультиплеером S.T.A.L.K.E.R., там сервер был представлен отдельным экземпляром игры, но без графического элемента (вместо отображения мира, игрока и т.д., мы получаем консоль), т.е. сервер имеет полные данные о всем игровом мире, все расчеты идут именно на сервере, а клиенты с ним синхронизируются, не расчитывая важные данные самостоятельно (для сохранения синхронизации). И у меня появилась идея, что если сделать подобное для SA-MP - подключить экземпляр игры к серверу, без графической состовляющей, т.е. убрать рендеринг, убрать звук, оставить расчеты физики и ИИ педов. Тогда боты будут работать аналогично педам в одиночной игре, с интеллектом, и будет информация о игровом мире, вся физическая модель присутствует на сервере.
Теперь вопрос, к знающим людям: возможно ли отключить у игры рендеринг и звук, оставив работоспособными обработку физики и ИИ?
Здравствуйте все, я сделал чтение файлов путей гта са,получаю координаты,линки и т.д...пытаюсь заставить педа идти по пути а он ходит назад вперёд между 2 точками....т.к. получается что:
точка 0 идёт к линку 0 линк 0 ведёт к точке 160 точка 160 ведёт к линку 220 а линк 220 ведёт к точке 0 и так далее...
не могу никак разобраться как найти следующую точку на пути?
Если тут комуто это интересно ещё:
в 0.3 есть встроенные нпк но каждый бот создавал отдельный процесс и "ел" 3 мб оперативки,так же они не могли выполнять команды типа walk to/run/shot и т.д. , поэтому я решил доделать то что начал давным давно и у меня всё получилось (знаю просто уже на много больше чем тогда)
Plugin for SA:MP 0.3a R4 server
Controllable NPC 0.1
by 009
Плагин убирает использование samp_npc.exe что экономит оперативную память и сокращает количество процессов от samp.
Так же плагин даёт возможность управлять действиями NPC
Функции:
CreateNPC(npcid,npcname[]); - создать NPC с указанным id и именем (имя не играет роли вообще)
DestroyNPC(npcid); - уничтожить NPC
SetNPCPos(npcid,Float:X,Float:Y,Float:Z); - сменить координаты NPC
NPC_AimAt(npcid,Float:X,Float:Y,Float:Z); - NPC прицелится в указанную точку
NPC_ShotAt(npcid,Float:X,Float:Y,Float:Z); - NPC стреляет в указанную точку
NPC_WalkTo(npcid,Float:X,Float:Y,Float:Z); - NPC идёт в указанную точку
NPC_RunTo(npcid,Float:X,Float:Y,Float:Z); - NPC бежит лёгким бегом в указанную точку
NPC_SprintTo(npcid,Float:X,Float:Y,Float:Z); - NPC бежит быстрым бегом в указанную точку
SetNPCWeapon(npcid,weaponid); - сменить оружие NPC
KillNPC(npcid); - убить NPC
SpawnNPC(npcid); - заспавнить NPC
StopNPC(npcid); - остановить текущее действие NPC
Каждый NPC работает на отдельном потоке что означает что лагов от них практически не будет
Вы можете убить NPC из оружия
В архиве вложен тест-мод для NPC, используйте /state 0 - 5 чтобы повеселиться (лучше человек 5,так веселее будет)
Скачать можно тут: download
Информация о разработке новой версии: projects
Включется синхронизация автоматически, как только выставляется флаг, что началась сетевая игра.
После этого, любое действие в игре (включая погоду, радиостанции, время и т.д.) начинает синхронизироваться на всех участников игры.@WNeZRoS - match-making - подбор участников игры (по рейтингу, friend/non-friend, бан читеров и т.д.)
начинает синхронизироваться но стандартными методами игры,да?и нам получается надо будет перенаправить данные на наш сетевой двиг,верно,или нет?=)
P.S.
extern "C" SOCKET __stdcall xlive_3 (int af, int type, int protocol) { // XSocketCreate trace ("xlive_3: XCreateSocket (%d, %d, %d)\n", af, type, protocol); return INVALID_SOCKET; } extern "C" int __stdcall xlive_4 (SOCKET s) { // XSocketClose trace ("xlive_4: XSockeClose)\n"); return 0; } extern "C" int __stdcall xlive_5 (SOCKET s, int how) { // XSocketShutdown trace ("xlive_5: XSocketShutdown\n"); return 0; } extern "C" int __stdcall xlive_6 (SOCKET s, long cmd, long * argp) { // XSocketIOCTLSocket trace ("xlive_6: XSocketIOCTLSocket\n"); return 0; } extern "C" int __stdcall xlive_7 (SOCKET s, DWORD, DWORD, DWORD, DWORD) { // XSocketSetSockOpt trace ("xlive_7: XSocketSetSockOpt\n"); return 0; } extern "C" int __stdcall xlive_9 (SOCKET s, sockaddr_in * name, int * namelen) { // XSocketGetSockName trace ("xlive_9: XSocketGetSockName\n"); if (namelen && name && *namelen == sizeof (sockaddr_in)) memset (name, 0, sizeof (sockaddr_in)); return 0; } extern "C" SOCKET __stdcall xlive_11 (SOCKET s, sockaddr_in * addr, int * addrlen) {// XSocketBind trace ("xlive_11: XSocketBind\n"); return INVALID_SOCKET; } extern "C" int __stdcall xlive_12 (SOCKET s, sockaddr_in * addr, int * addrlen) {// XSocketConnect trace ("xlive_12: XSocketConnect\n"); return 0; } extern "C" int __stdcall xlive_13 (SOCKET s, int backlog) { // XSocketListen trace ("xlive_13: XSocketListen\n"); return 0; } extern "C" SOCKET __stdcall xlive_14 (SOCKET s, sockaddr_in * addr, int * addrlen) { // XSocketAccept trace ("xlive_14: XSocketAccept\n"); return INVALID_SOCKET; } extern "C" int __stdcall xlive_15 (int n, void *, void *, void *, void *) { // XSocketSelect trace ("xlive_15: XSocketSelect\n"); return 0; } extern "C" int __stdcall xlive_18 (SOCKET s, char * buf, int len, int flags) { // XSocketRecv return 0; } extern "C" int __stdcall xlive_20 (SOCKET s, char * buf, int len, int flags, sockaddr_in * from, int fromlen) { // XSocketRecvFrom return 0; } extern "C" int __stdcall xlive_22 (SOCKET s, char * buf, int len, int flags) { // XSocketSend return 0; } extern "C" int __stdcall xlive_24 (SOCKET s, char * buf, int len, int flags, sockaddr_in * to, int tolen) { // XSocketSendTo return 0; } extern "C" int __stdcall xlive_26 (char *) { // XSocketInet_Addr trace ("xlive_26: XSocketInet_Addr\n"); return 0; }
это для использования сокетов игрового сетевого движка?
сетевая часть это RakNet...а вот как нам заюзать механизм синхронизации игры???(эт я от себя спрашиваю,мож кто из команды разрабов и понял но я вот хз:D)
Здравствуйте все.
Команда русских разработчиков во главе с WNeZRoS разрабатывает мультиплеер для GTA IV,и не помешала бы помощь listener'a и Seemann'a т.к. вы работаете с внутренностями гта намного дольше нас всех=)
[center]FOUR-MP
Russian GTA IV Multiplayer[/center]FOUR-MP v0.03
В новой версии добавлено:
Синхронизация прыжков
Синхронизация приседаний
Чат (с русским у него плохо, очень чувствительные буквы (shift работает но плохо))
Список игроков на экране (Now at screen)ищутся люди способные перевести сервер под Widows в сервер под linux
Скоро будет v0.1b
Скриптовой язык SQUIRREL
Поддержка чатом русского языка есть
Поддержки версии 1C нет (может будет) (поверх 1С 1.0.3.1 становится 1.0.4.0)
Сейчас в мп использован GTA IV C++ Script Hook ,но нужен собственный чтобы его можно было редактировать и была поддержка всех версий,вы принимали участие в разработке GTA IV C++ Script Hook может поможете нам сделать хук для мп?=)
Офф сайт разработки: four-mp.com
изза глючного плагина начал писать свой "управляющий RakNet"....короч использовать функции сетевого движка сампа для отправки фальшивых пакетов о подключении игрока
Но тут такая фигня,я нашёл в ассемблере как выглядят эти функции в месте где используются для подключения игрока,но вот с этими eax и т.д. я не разобрался до сих пор...
Вот код полный:
.text:00474477 loc_474477: ; CODE XREF: sub_4743C0+BFj .text:00474477 mov cl, [eax] .text:00474479 mov [edx+eax], cl .text:0047447C inc eax .text:0047447D test cl, cl .text:0047447F jnz short loc_474477 .text:00474481 mov eax, [ebp+esi*4+320h] .text:00474488 mov [eax], bl .text:0047448A xor eax, eax .text:0047448C mov dword ptr [ebp+esi*4+0], 1 .text:00474494 mov [ebp+esi*4+19C8h], eax .text:0047449B mov [ebp+esi*4+1CE8h], eax .text:004744A2 mov [ebp+esi*4+2328h], eax .text:004744A9 lea ecx, [esp+148h+var_124] .text:004744AD mov [esi+ebp+2648h], al .text:004744B4 call sub_43C7F0 .text:004744B9 push 1 .text:004744BB push 8 .text:004744BD lea edx, [esp+150h+var_138] .text:004744C1 push edx .text:004744C2 lea ecx, [esp+154h+var_124] .text:004744C6 mov [esp+154h+var_4], 1 .text:004744D1 mov [esp+154h+var_138], bl .text:004744D5 call sub_43CE90 .text:004744DA mov eax, edi .text:004744DC lea ecx, [eax+1] .text:004744DF nop .text:004744E0 .text:004744E0 loc_4744E0: ; CODE XREF: sub_4743C0+125j .text:004744E0 mov dl, [eax] .text:004744E2 inc eax .text:004744E3 test dl, dl .text:004744E5 jnz short loc_4744E0 .text:004744E7 sub eax, ecx .text:004744E9 push 1 .text:004744EB mov ebx, eax .text:004744ED push 8 .text:004744EF lea eax, [esp+150h+var_138] .text:004744F3 push eax .text:004744F4 lea ecx, [esp+154h+var_124] .text:004744F8 mov [esp+154h+var_138], bl .text:004744FC call sub_43CE90 .text:00474501 movzx ecx, bl .text:00474504 push ecx .text:00474505 push edi .text:00474506 lea ecx, [esp+150h+var_124] .text:0047450A call sub_43CF40 .text:0047450F mov edx, dword_4B7CCC .text:00474515 mov edi, [edx] .text:00474517 mov eax, [edi] .text:00474519 push esi .text:0047451A lea ecx, [esp+14Ch+var_12A] .text:0047451E push ecx .text:0047451F mov ecx, edi .text:00474521 call dword ptr [eax+0DCh] .text:00474527 mov ebx, [eax] .text:00474529 mov ax, [eax+4] .text:0047452D mov edx, [edi] .text:0047452F push 0 .text:00474531 push 1 .text:00474533 sub esp, 8 .text:00474536 mov ecx, esp .text:00474538 push 0 .text:0047453A mov [ecx], ebx .text:0047453C push 2 .text:0047453E mov [ecx+4], ax .text:00474542 push 1 .text:00474544 lea ecx, [esp+164h+var_124] .text:00474548 push ecx .text:00474549 push offset unk_49BA78 .text:0047454E mov ecx, edi .text:00474550 call dword ptr [edx+7Ch] .text:00474553 mov edx, dword_4B7CCC .text:00474559 mov ecx, [edx] .text:0047455B mov eax, [ecx] .text:0047455D push esi .text:0047455E lea edx, [esp+14Ch+in] .text:00474562 push edx .text:00474563 call dword ptr [eax+0DCh] .text:00474569 mov eax, dword ptr [esp+148h+in.S_un] .text:0047456D push eax ; in .text:0047456E call ds:inet_ntoa
а вот отдельно:
запись ида подключившегося игрока:
.text:004744B9 push 1 .text:004744BB push 8 .text:004744BD lea edx, [esp+150h+var_138] .text:004744C1 push edx .text:004744C2 lea ecx, [esp+154h+var_124] .text:004744C6 mov [esp+154h+var_4], 1 .text:004744D1 mov [esp+154h+var_138], bl .text:004744D5 call sub_43CE90
Запись длины имени:
.text:004744E9 push 1 .text:004744EB mov ebx, eax .text:004744ED push 8 .text:004744EF lea eax, [esp+150h+var_138] .text:004744F3 push eax .text:004744F4 lea ecx, [esp+154h+var_124] .text:004744F8 mov [esp+154h+var_138], bl .text:004744FC call sub_43CE90
И запись имени,длины имени:
.text:00474501 movzx ecx, bl .text:00474504 push ecx .text:00474505 push edi .text:00474506 lea ecx, [esp+150h+var_124] .text:0047450A call sub_43CF40
Далее отправка пакета игрокам(не уверен что это то):
.text:0047450F mov edx, dword_4B7CCC .text:00474515 mov edi, [edx] .text:00474517 mov eax, [edi] .text:00474519 push esi .text:0047451A lea ecx, [esp+14Ch+var_12A] .text:0047451E push ecx .text:0047451F mov ecx, edi .text:00474521 call dword ptr [eax+0DCh] .text:00474527 mov ebx, [eax] .text:00474529 mov ax, [eax+4] .text:0047452D mov edx, [edi] .text:0047452F push 0 .text:00474531 push 1 .text:00474533 sub esp, 8 .text:00474536 mov ecx, esp .text:00474538 push 0 .text:0047453A mov [ecx], ebx .text:0047453C push 2 .text:0047453E mov [ecx+4], ax .text:00474542 push 1 .text:00474544 lea ecx, [esp+164h+var_124] .text:00474548 push ecx .text:00474549 push offset unk_49BA78 .text:0047454E mov ecx, edi .text:00474550 call dword ptr [edx+7Ch] .text:00474553 mov edx, dword_4B7CCC .text:00474559 mov ecx, [edx] .text:0047455B mov eax, [ecx] .text:0047455D push esi .text:0047455E lea edx, [esp+14Ch+in] .text:00474562 push edx .text:00474563 call dword ptr [eax+0DCh] .text:00474569 mov eax, dword ptr [esp+148h+in.S_un] .text:0047456D push eax ; in .text:0047456E call ds:inet_ntoa
а вот как выглядит всё это в соурсе сампа:
RakNet::BitStream bsSend; bsSend.Write(bytePlayerID); bsSend.Write(strlen(szPlayerName)); bsSend.Write(szPlayerName,strlen(szPlayerName)); pNetGame->GetRakServer()->RPC("xx",&bsSend,HIGH_PRIORITY,RELIABLE_ORDERED,0, pNetGame->GetRakServer()->GetPlayerIDFromIndex(bytePlayerID),TRUE,FALSE);
Как я понял для "упаковки" в пакет мне надо знать по какому адресу сидит bsSend
А для отправки: pNetGame
Помогите пожалуйста
kye говорит о pedах,а про ботов он сам согласился что они возможны,но он из не одобряет...
плагин Sacky работает,ботов создаёт но я их не использовал когда 0.2.2 ещё был...а щас понадобились но уже 0.2Х версия((
в 59 посту я описал как можно создать бота на стороне игрока(бот не пед,он иммитация игрока у которого будет жизнь,ник и т.д. а пед это пед)...может кто нибудь сможет всё таки разобраться в плагине Y_Less'a?
Здравствуйте уважаемые
Разработку я не забросил,встретил большие проблемы с ботами для сервера...точнее большие проблемы с иммитированием их подключения к серверу(проще говоря встал в мертвой точке),но есть другой вариант при чём более легкий и выполнимый...только для этого надо как то перебрать сложный для понимания плагин...ну расскажу по порядку:
Сервер самп использует бесплатный сетевой движок - RakNet,и есть плагин разработчика сампа,Y_Less'a ,где через память плагин собирает пакет и отправляет его игроку(через серверный RakNet).Поэтому я собираюсь собрать пакет где будет информация о "подключившемся игроке" и т.к. у клиента нет никаких проверок на бота и т.д. то он сразу же добавит псевдоигрока,а сервер не будет ничего об этом подозревать.после этого можно так же посылать пакеты выставления координат и т.д.,всё что душе угодно...но загвозтка в том что плагин Y_Less'a очень запутанный(по крайней мере для меня),я хотел взять от туда систему доступа к RakNet'y сервера,но не получилось,потом пытался изменить существующие функции,но сервер начел говорить "нет данной функции",поэтому обращаюсь к умельцам с просьбой дать мне код этой системы доступа пожалуйста помогите...
Плагин цепляю в архиве к сообщению...
В разговоре по irc с Y_Less'ом он сказал вот что:
"<Y_Less> You can't just set an address to true to connect a player, you need to fake a connection to the network layer"
Что переводится как:Вы не можете выставить значение true на слот игрока,вы должны фальсифицировать соединение с сетью.
По мойму лучше поверить Y_Less'у а не kye(с его этим SetPlayerChecpoint),поэтому у меня вопрос:как можно фальсифицировать соединение с сетью?(я не успел спросить у Y_Less'а,он уходил,но сказал что ещё можно будет обращаться и пожелал удачи с проектом
Здрасти всем...
вот при использовании того адреса что дал listener слот действительно закрывался но вылетала ошибка сервера...я решил попробовать спросить по irc у kye(главный разработчик сампа) и на удивление он мне ответил...сказал что адрес правильный и что ошибка связана с скриптовой функцией SetPlayerChecpoint...
вот адрес который в ошибке был:0x00473EBB
главное с чегото начать учиться пользоваться ассемблером;-)
СПС!получилось!не знаете где книжку по ассемблеру взять?
точно,а я то подумал что эт он не ответил когда зашёл!:lol::lol::lol:
как сделать слежку за всеми действиями внутри процесса в дебаггере,можете нормально обьяснить?
дело в том что sBot написан для 0.2.2 версии сампа,а сейчас 0.2Х в которой главный разработчик keyman сделал защиту от sbot т.к. sbot был сделан используя украденные исходники сампа,среди которых имелся исходник сервера...
написал письмо одному из разработчиков сампа-Y_Less'у,может помощет...вот копия:
Hello, I and some more Russian programmers we try to make boats for SA-MP in the form of a plug-in (please do not speak "not probably" and "do not spend in vain time", we will not stop working out not having received desirable result), at present we study samp-server.exe through assembler as we are going to do these boats operating memory of a server (some addresses), I the initiator of this working out, though and not the strong programmer. Recently using source codes vc-mp 0.1c and assembler's code vc-mp 0.1c server we have understood as in sa-mp on defined slot the player value is put occupied"(TRUE) in assembler this line looks so:
Code:
mov dword ptr [ebp+esi*4+0], 1Where edp it CPlayerPool and esi it id the player in format BYTE
You, of course, all it and so know, but I wished to show that we not stupidly set questions, we really work over a plug-in. And which I ask the help from you it is edp (CPlayerPool address without which to execute closing slot it is not obviously possible, and which I cannot find in any way, please help.
Also forgive for my bad English, I used translator PROMT
Yours faithfully, 009
вродь норм написано,надеюсь поможет
как найти этот адрес плин(((я уже мозг сломал с этим адресом
что это может значить:
.text:0046AE4A call ebp ; Sleep
этот адрес я взял из файла crashinfo.txt в который при сбое сервер записывает вот такое:
--------------------------
Exception At Address: 0x10004A6A
Registers:
EAX: 0x00000001 EBX: 0x00000002 ECX: 0x00CDFF20 EDX: 0x7C90E4F4
ESI: 0x7C801AD4 EDI: 0x7C802446 EBP: 0x7C802446 ESP: 0x00CDFF78
EFLAGS: 0x00010202
Stack:
(DWORD *)(0x7C802446+0x00*4) = 1;
не компилит,говорит не верный тип
делал так:
(DWORD *)(0x7C802446+0x00*4) = (DWORD *)(1);
пишет left operand must be l-value
что значит
inc ebp
???