Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- script_name("MDX | TRAIN BOT")
- script_author("madrasso")
- script_version("1.4")
- script_properties("work-in-pause")
- local hook = require('lib.samp.events')
- local encoding = require('lib.encoding')
- local memory = require('memory')
- local request = require('lib.requests')
- memory.fill(0x00531155, 0x90, 5, true) -- fix jump
- local font = renderCreateFont("Arial", 10, 12)
- encoding.default = 'CP1251'
- u8 = encoding.UTF8
- cp1251 = encoding.CP1251
- local inicfg = require('inicfg')
- local config = inicfg.load({
- settings = {
- id = 0;
- ['auto-crash'] = false;
- }
- }, '[mdx scripts] TRAIN BOT');
- local other = {color = '2e82ff'};
- local points = {
- [1] = {2822.626953125, 90.498596191406, 24.95460319519};
- [2] = {2864.75, 1329.0899658203, 9.7203121185303};
- [3] = {1392.3271484375, 2632.25, 9.7203121185303};
- [4] = {-1944.375, 82.024803161621, 24.618618011475};
- [5] = {838.77020263672, -1388.5576171875, -2.7222609519958}
- }
- local info = {
- status = false;
- state = false;
- flights = 0;
- earn = 0;
- pickUp = nil;
- point = 'не обнаружен';
- speed = 34;
- dist = 210;
- wait = 5000;
- boostSpeed = false;
- }
- function chat(msg, type)
- if type == nil then type = true end
- local color = (type and other.color or 'f50575')
- local msg = msg:gsub('{color}', '{'..color..'}')
- sampAddChatMessage(' mdx scripts {FFFFFF}| '..msg, (type and '0x'..other.color or 0xf50575))
- end
- local function xf()
- while not isSampAvailable() do wait(0) end
- chat('Проверка наличия лицензии успешно пройдена.')
- if tonumber(config['settings']['id']) >= 1 then
- chat('По умолчанию установлен ид вконтакте: {color}'..config['settings']['id'])
- end
- if config['settings']['auto-crash'] then
- chat('По умолчанию включена функция автокраша')
- end
- end
- function main()
- xf()
- while not isSampfuncsLoaded() or not isSampLoaded() do wait(0) end
- commands();
- lua_thread.create(function()
- while true do wait(0)
- if info['status'] then
- renderDrawBoxWithBorder(39, 215, 200, 90, 0xAA000000, 3, 0x90f50575)
- renderFontDrawText(font, "Поинт: "..info['point'], 49, 230, 0xFFFFFFFF, 0x90000000)
- renderFontDrawText(font, "Заработано: "..info['earn'], 49, 250, 0xFFFFFFFF, 0x90000000)
- renderFontDrawText(font, "Количество рейсов: "..info['flights'], 49, 270, 0xFFFFFFFF, 0x90000000)
- local text, _, _, _ = sampGetChatString(99)
- if text:find('closed the connection') or text:find("You are banned from this server") or text:find('Use /quit to exit or press') or text:find("Lost connection to the server") then
- sampAddChatMessage(" ", -1)
- sendVK('Вы были кикнуты.')
- end
- end
- end
- end)
- while true do wait(0)
- if info['pickUp'] then
- if info['pickUp'][1] and info['pickUp'][2] and info['pickUp'][3] then
- if isCharInAnyCar(PLAYER_PED) then
- local car = storeCarCharIsInNoSave(PLAYER_PED);
- local speed = getCarSpeed(car)
- printString(math.floor(speed), 50)
- local x,y,z = getCharCoordinates(PLAYER_PED)
- local dist = getDistanceBetweenCoords3d(x,y,z, info['pickUp'][1], info['pickUp'][2], info['pickUp'][3])
- local tormoz = tonumber((info['boostSpeed'] and '120' or info['dist']));
- local tormoz2 = tonumber((info['boostSpeed'] and '15' or '80'));
- if tonumber(dist) < tormoz and tonumber(dist) > tormoz2 then
- info['state'] = 'brake'
- elseif tonumber(dist) < 10 then
- info['state'] = 'full_brake'
- end
- end
- if info['status'] and info['state'] == 'gas' and isCharInAnyCar(PLAYER_PED) then
- local car = storeCarCharIsInNoSave(PLAYER_PED);
- local speed = getCarSpeed(car)
- if speed < tonumber(info['speed']) then
- if info['boostSpeed'] and speed < 10 then
- for i = speed, info['speed'], 2 do
- wait(200)
- setTrainSpeed(car, i);
- end
- end
- press_gas();
- end
- elseif info['status'] and isCharInAnyCar(PLAYER_PED) then
- local car = storeCarCharIsInNoSave(PLAYER_PED);
- local speed = getCarSpeed(car)
- if info['state'] == 'brake' then
- if speed >= 8 then
- if info['boostSpeed'] then
- print('bost brake')
- for i = speed, 7, -4 do
- wait(150)
- if isCharInAnyCar(PLAYER_PED) then
- setTrainSpeed(car, i);
- end
- end
- end
- press_brake();
- end
- elseif info['state'] == 'full_brake' then
- if speed > 1.2 then
- if info['boostSpeed'] then
- print('bost brake full')
- wait(300)
- if isCharInAnyCar(PLAYER_PED) then
- setTrainSpeed(car, 1);
- end
- end
- press_brake();
- else
- if isCharInAnyCar(PLAYER_PED) then
- setTrainSpeed(car, 0.6);
- end
- wait(500);
- if isCharInAnyCar(PLAYER_PED) then
- setTrainSpeed(car, 0);
- end
- wait(info['wait']);
- if isCharInAnyCar(PLAYER_PED) then
- setTrainSpeed(car, 0);
- info['state'] = 'gas'
- end
- wait(500)
- end
- end
- elseif info['status'] and info['state'] == 'toPickUp' then
- GoToCoord(-2095.4909667969, 514.75042724609, 1487.6927490234);
- GoToCoord(-2098.5727539063, 512.82043457031, 1487.6927490234);
- GoToCoord(-2102.4104003906, 512.78045654297, 1487.6927490234);
- good_dialog = false;
- while not good_dialog do
- setGameKeyState(21, 255);
- sampForceOnfootSync();
- wait(5000);
- end
- good_dialog = false;
- info['state'] = false;
- end
- end
- end
- end
- end
- function commands()
- sampRegisterChatCommand('tgo', train_start)
- sampRegisterChatCommand('tgo.id', train_id)
- sampRegisterChatCommand('tgo.crash', train_crash)
- sampRegisterChatCommand('tgo.speed', train_speed)
- sampRegisterChatCommand('tgo.dist', train_dist)
- sampRegisterChatCommand('tgo.wait', train_wait)
- sampRegisterChatCommand('tgo.boost', function()
- info['boostSpeed'] = not info['boostSpeed']
- chat('Буст скорости {color}'..(info['boostSpeed'] and 'активирован' or 'деактивирован'),info['boostSpeed'])
- end);
- end
- function hook.onServerMessage(color, msg)
- if msg:find('Рейс успешно завершен') then
- info['earn'] = info['earn'] + tonumber(msg:match('Заработано за рейс: (%d+)%$'))
- info['flights'] = info['flights'] + 1
- sendVK('Рейс успешно завершен.\n\nЗаработано виртов: '..info['earn']..'\n Количество рейсов проехано: '..info['flights'])
- lua_thread.create(function() info['state'] = false wait(9000) info['state'] = 'toPickUp' end)
- elseif msg:match('Администратор .*:.*{%w+}.*') then
- local admin, answer = msg:match('Администратор (.*):.*{%w+}(.*)')
- sendVK('Администратор '..tostring(admin)..': '..tostring(answer))
- if config['settings']['auto-crash'] then callFunction(0x823BDB, 3, 3, 0, 0, 0) end
- end
- end
- function hook.onTextDrawSetString(id, text)
- if id == 2074 then
- info['pickUp'] = points[tonumber(text)]
- info['point'] = tonumber(text)
- print('Point: '..tonumber(text))
- end
- end
- function hook.onShowDialog(id, style, title, btn1, btn2, text)
- if info['status'] then
- if text:find('Вы хотите занять очередь на регистрацию рейса') then
- good_dialog = true
- sampSendDialogResponse(id, 1, -1, -1)
- return false
- elseif text:find('Ваша очередь подошла, завершить регистрацию рейса') then
- info['state'] = false
- lua_thread.create(function()
- sendVK('Новый рейс успешно начат.')
- wait(15000)
- info['state'] = 'gas';
- end)
- sampSendDialogResponse(id, 1, -1, -1)
- return false
- elseif text:find'Сейчас все рабочие места на рейсах заняты' then
- sampSendDialogResponse(id, 1, -1, -1)
- return false
- elseif text:find('в живой очереди на регистрацию рейса') then
- sampSendDialogResponse(id, 1, -1, -1)
- return false
- elseif text:find('Вы хотите освободить своё место в очереди') then
- good_dialog = true
- sampSendDialogResponse(id, 0, -1, -1)
- return false
- end
- end
- end
- function train_start()
- info['status'] = not info['status']
- WorkInBackground(info['status']);
- chat('Статус бота: {color}'..(info['status'] and 'включен' or 'выключен'), info['status'])
- if isCharInAnyCar(PLAYER_PED) then
- info['state'] = (info['status'] and 'gas' or false)
- end
- end
- function train_id(var)
- if tonumber(var) == nil or #var == 0 or tonumber(var) <= 0 then
- chat('Неверно указан ид вконтакте.', false)
- return
- else
- chat('Установлен новый ид вконтакте: {color}'..tonumber(var))
- config['settings']['id'] = tonumber(var)
- inicfg.save(config, '[mdx scripts] TRAIN BOT')
- end
- end
- function train_crash()
- config['settings']['auto-crash'] = not config['settings']['auto-crash']
- chat('Автоматический краш {color}'..(config['settings']['auto-crash'] and 'включен' or 'выключен'), config['settings']['auto-crash'])
- end
- function train_speed(var)
- if tonumber(var) == nil or #var == 0 or tonumber(var) <= 0 then
- chat('Укажите число.', false)
- return
- else
- chat('Установлена новая максимальная скорость: {color}'..tonumber(var))
- info['speed'] = tonumber(var);
- end
- end
- function train_dist(var)
- if tonumber(var) == nil or #var == 0 or tonumber(var) <= 0 then
- chat('Укажите число.', false)
- return
- else
- chat('Установлена новая дистанция начатия торзможения: {color}'..tonumber(var))
- info['dist'] = tonumber(var);
- end
- end
- function train_wait(var)
- if tonumber(var) ~= nil then
- chat('Установлена новая задержка остановки на станциях: {color}'..tonumber(var))
- info['wait'] = tonumber(var);
- else
- chat('Укажите число.', false)
- return
- end
- end
- function press_gas()
- writeMemory(0xB73458 + 0x20, 1, 255, false)
- end
- function press_brake()
- writeMemory(0xB73458 + 0x1C, 1, 255, false)
- end
- function GoToCoord(x,y,z)
- local koef1, koef2 = 1.05, 0.02
- local function getPov(ang)
- return (ang^koef1)*koef2*100/memory.getfloat(0xB7CB50, true)
- end
- while not locateCharAnyMeans2d(PLAYER_PED, x, y, 1, 1, true) and info['status'] do
- local POSX,POSY,POSZ = getCharCoordinates(PLAYER_PED)
- local angle = math.acos((x-POSX)/math.sqrt((x - POSX)*(x - POSX)+(y - POSY)*(y - POSY)))
- if POSY > y then angle = 2*math.pi - angle end --получение угла
- if angle < 0 then angle = angle + 2*math.pi end
- angle = math.deg(angle)
- local angX = math.asin((z-POSZ)/math.sqrt((z-POSZ)^2+(y-POSY)^2))
- local cpx,cpy,cpz = getActiveCameraCoordinates()
- local cx,cy,cz = getActiveCameraPointAt()
- local curangle = math.acos((cx-cpx)/math.sqrt((cx-cpx)*(cx-cpx)+(cy-cpy)*(cy-cpy)))
- if cpy > cy then curangle = 2*math.pi - curangle end -- получение текущего угла камеры
- curangle = math.deg(curangle)
- local heading = getCharHeading(PLAYER_PED) + 90
- if heading > 360 then heading = heading - 360 end
- local angsum = 360 - curangle + angle
- if angsum > 360 then angsum = angsum - 360 end
- if angsum < 180 then curangle = curangle + getPov(angsum)
- else curangle = curangle - getPov(360-angsum) end
- local xAngle = math.asin((z-POSZ)/math.sqrt((z-POSZ)^2+(math.sqrt((x-POSX)^2+(y-POSY)^2))^2))
- setCameraPositionUnfixed(xAngle,math.rad(curangle)+math.pi)
- setGameKeyState(1, -255)
- wait(0)
- end
- end
- function WorkInBackground(work)
- local memory = require 'memory'
- if work then
- memory.setuint8(7634870, 1)
- memory.setuint8(7635034, 1)
- memory.fill(7623723, 144, 8)
- memory.fill(5499528, 144, 6)
- else
- memory.setuint8(7634870, 0)
- memory.setuint8(7635034, 0)
- memory.hex2bin('5051FF1500838500', 7623723, 8)
- memory.hex2bin('0F847B010000', 5499528, 6)
- end
- end
- function sendVK(text)
- if tonumber(config['settings']['id']) == nil or type(config['settings']['id']) ~= 'number' then
- chat('Неверно указан ид страницы, отправка сообщения отменена.', false)
- return
- end
- local _, myid = sampGetPlayerIdByCharHandle(PLAYER_PED)
- local text = toSendGet("[TRAIN-BOT]\n"..text.."\n\n - "..sampGetPlayerNickname(myid).."["..myid.."] - "..tostring(getServer()).."❤")
- local result, response = pcall(request.get, "http://scripts.mdx-scripts.ru/notifications/messages.php?message="..text.."&id="..config['settings']['id'].."&type=send")
- end
- function toSendGet(str)
- local diff = urlencode(u8:encode(str, 'CP1251'))
- return diff
- end
- function urlencode(str)
- if (str) then
- str = string.gsub (str, "\n", "\r\n")
- str = string.gsub (str, "([^%w ])",
- function (c) return string.format ("%%%02X", string.byte(c)) end)
- str = string.gsub (str, " ", "+")
- end
- return str
- end
- function getServer()
- servers = {"Phoenix", "Tucson", "Scottdale", "Chandler", "Brainburg", "Saint Rose", "Mesa", "Red-Rock", "Yuma"}
- for i = 1, #servers do
- if sampGetCurrentServerName():find(servers[i]) then
- return servers[i]
- end
- end
- return 'Unknown'
- end
- function SearchMarker(posX, posY, posZ, radius, isRace)
- local ret_posX = 0.0
- local ret_posY = 0.0
- local ret_posZ = 0.0
- local isFind = false
- for id = 0, 31 do
- local MarkerStruct = 0
- if isRace then MarkerStruct = 0xC7F168 + id * 56
- else MarkerStruct = 0xC7DD88 + id * 160 end
- local MarkerPosX = representIntAsFloat(readMemory(MarkerStruct + 0, 4, false))
- local MarkerPosY = representIntAsFloat(readMemory(MarkerStruct + 4, 4, false))
- local MarkerPosZ = representIntAsFloat(readMemory(MarkerStruct + 8, 4, false))
- if MarkerPosX ~= 0.0 or MarkerPosY ~= 0.0 or MarkerPosZ ~= 0.0 then
- if getDistanceBetweenCoords3d(MarkerPosX, MarkerPosY, MarkerPosZ, posX, posY, posZ) < radius then
- ret_posX = MarkerPosX
- ret_posY = MarkerPosY
- ret_posZ = MarkerPosZ
- isFind = true
- radius = getDistanceBetweenCoords3d(MarkerPosX, MarkerPosY, MarkerPosZ, posX, posY, posZ)
- end
- end
- end
- return isFind, ret_posX, ret_posY, ret_posZ, radius
- end
- function hook.onSendVehicleSync(data)
- if info['status'] then
- if tonumber(math.sqrt(data.moveSpeed.x * data.moveSpeed.x + data.moveSpeed.y * data.moveSpeed.y + data.moveSpeed.z * data.moveSpeed.z) * 126) > 80 then
- data.moveSpeed.x = 0
- data.moveSpeed.y = 0.66996252536774
- data.moveSpeed.z = 0.0033537545241416
- end
- end
- end
- function hook.onSendDeathNotification(reason, killerId)
- sendVK('Вы умерли.')
- end
Add Comment
Please, Sign In to add comment