Jump to content

abadabadu

Members
  • Posts

    72
  • Joined

  • Last visited

Everything posted by abadabadu

  1. Hello. I was looking for some way to avoid double login. (Case: 2 servers with same resource running ( server 1, server 2 ). 1 MySQL database with table named "users" containing nicks and passwords for all players. Player connects server 1 and log in with nick and password. Then player will know that his friend is playing in server 2. He leave server 1 and go to server 2. But player must to login again in server 2.) We can use cookies only in http, not with gamemode resources. Serials do not 100% grant security. Suggestion: Add "key" value to redirectPlayer function. I mean, when server 1 redirect player to server 2 it do it with function redirectPlayer. bool redirectPlayer ( player thePlayer, string serverIP, int serverPort, [ string serverPassword ] ) To avoid double login in server 2, we can use some "key" value in redirectPlayer function bool redirectPlayer ( player thePlayer, string serverIP, int serverPort, [ string serverPassword ], [ string key ] ) In this way, before redirect player server 1 creates some secret key KDHFL9070324, save it in MySQL database + associate it with player who want to go to server 2, then redirect this player to server 2 with key param in redirectPlayer function . bool redirectPlayer ( player, 127.0.0.1, 22003, "", [b]KDHFL9070324 [/b]) Server 2 then select from MySQL db data associated with this key KDHFL9070324 and will know who was redirected to. (For security reason key must be for one-use only and has 1 min live time, plus associated with IP/serial etc)
  2. Cookie in gamemode resource? Wiki: These functions can only be used from within lua blocks in HTML pages hosted by the server. We cant use cookies for this aim. Serials also is not the best way. Wiki:However, you shouldn't rely on them entirely: serials may be able to be faked, although this is quite difficult to do, and it's very likely to cause errors to the client that can lead to a global ban if asking for help to fix them. It is also not guaranteed that two players will not have the same serial, but that is extremely unlikely. So there is no any built-in way,system, mechanizm developorers made to avoid double login when changing servers? Thanks for answer.
  3. Example: 2 servers with same resource running ( server 1, server 2 ). 1 MySQL database with table named "users" containing nicks and passwords for all players. Player connects server 1 and log in with nick and password. Then player will know that his friend is playing in server 2. He leave server 1 and go to server 2. But player must to login again in server 2. Question: is there any way to avoid double login when changing servers ( if servers use single users database )? R there sessions or any other system?
  4. When I attach object to vehcile: local veh = getPedOccupiedVehicle ( localPlayer ) local x, y, z = getElementPosition ( veh ) local attached = createObject ( 2455, x,y, 30,0,0,0 ) attachElements ( attached, veh, 0, 3, 0 ) And then I try to rotate attached element with setElementRotation () local x2, y2, z2 = getElementRotation ( attached ) setElementRotation ( attached, x2 + 1, y2 + 1, z2 + 1 ) "attached" element does NOT rotate. ( Even getElementRotation(attached) called in the same frame returns result like it was rotated ). Is there any way to rotate atteched element without breaking the attachment?
  5. Example... I have resource "resCool". It is gamemode for 100 players. Resurce has 1000mb client files. I run server1 "MTA Server1" on machine with IP1:port1. Set maxplayers value to 100. Install resource "resCool" to server1 and start it. Invite my friend Mike. Mike joins server1 "MTA Server1" and download 1000 mb client files. Next day I realize that my "MTA Server1" contains 100 players and i cant accept new players. I run server2 "MTA Server2" in same machine with IP1:port2. Install same resource "resCool" to server2 and start it. Invite my friend Mike to this new server2. Question: 1) Will Mike download 1000mb client files again? IP is not new, port is new, server is new, resource is not new ( same files, same name ). I think answer is "Yes, Mike will download the same client files again. Because client files are cached to each new IP:PORT/recoursename". 2) Is it possible to avoid this? I mean, if i write resource "res" ( has 1000 mb client files), run server1 with IP1:port1 contains my resource "res", then players join server and download all client files. If then i run next server2 with IP1:port2 contains same resource "res" ( same 1000 mb client files), is it possible to re-use those 1000 mb client files in any way? Or all same players must re-download it when join server2?
  6. Hi. Does triggerServerClientEvent ( and triggerClientEvent ) grants delivery order? I mean, if trigger client event 3 times, 1 after 1, like this: triggerClientEvent (... "1" ... ) triggerClientEvent (... "2" ... ) triggerClientEvent (... "3" ... ) Is it granted that order in which client will receive this is the same. Like: 1 2 3 Or any net-connection-problems can cause something like: 1 3 2 Yes, with triggerClientEvent events are sent reliably, but who said that delivery order is granted too?
  7. Keep talking to myself I prefer to use custom system based upon triggerClientEvent. I thought that "setElementData VS trigger*Event" is "bandwidth VS CPU" (in case all another things 100% the same - mean in case i really need to sync data with every client does not matter using trigger*event or setElementData), but... Using setElementData we not only transfer more bytes, we need to process them, so every byte(packet, message?) needs CPU time. So CPU "argument" suffering too))) Even trigger*Event force u to write your overcode, debug it, maintain it, even the same already done in setElementData its better way to prefer trigger*Event becouse it let u save bandwith+some CPUtime wasting to deal with that packets (in case you really have possibility to do it in your mode - not everytime its possible, but in 99% cases i think...). I still need confirmation and advice...
  8. Keep talking to myself I prefer to use custom system based upon triggerClientEvent. I thought that "setElementData VS trigger*Event" is "bandwidth VS CPU" (in case all another things 100% the same - mean in case i really need to sync data with every client does not matter using trigger*event or setElementData), but... Using setElementData we not only transfer more bytes, we need to process them, so every byte(packet, message?) needs CPU time. So CPU "argument" suffering too))) Even trigger*Event force u to write your overcode, debug it, maintain it, even the same already done in setElementData its better way to prefer trigger*Event becouse it let u save bandwith+some CPUtime wasting to deal with that packets (in case you really have possibility to do it in your mode - not everytime its possible, but in 99% cases i think...). I still need confirmation and advice...
  9. Thanks for answer. Didnt devepolers fix it in 1.1? Still can see addEventHandler('onElementDataChange', root, function(dataName, oldValue ) if getElementType(source)=='player' and checkClient( false, source, 'onElementDataChange', dataName ) then setElementData( source, dataName, oldValue ) return end end ) in admin/server/admin_server.lua. But saw some posts from developers about fixing problem with fake client+setElementData in 1.1 and above. Isnt it correct? But, basing on wiki, triggerServerEvent can be faked too, like setElementData. In case with triggerServerEvent i still must to control who does that (like in system with setElementData). Does it mean triggerServerEvent does not free me from writing exactly the same (in base) some additional security scripts? Does that mean that saving bandwidht is only one real reason to use triggerServerOnly not setElementData.
  10. Some new investigation gives answers Looks like setElementData does NOT transfer oldValue. https://code.google.com/p/mtasa-blue/source/browse/trunk/MTA10/mods/deathmatch/logic/rpc/CElementRPCs.cpp void CElementRPCs::SetElementData ( CClientEntity* pSource, NetBitStreamInterface& bitStream ) { unsigned short usNameLength; if ( bitStream.ReadCompressed ( usNameLength ) ) { // We should never receive an illegal name length from the server if ( usNameLength > MAX_CUSTOMDATA_NAME_LENGTH ) { CLogger::ErrorPrintf ( "RPC SetElementData name length > MAX_CUSTOMDATA_NAME_LENGTH" ); return; } SString strName; CLuaArgument Argument; if ( bitStream.ReadStringCharacters ( strName, usNameLength ) && Argument.ReadFromBitStream ( bitStream ) ) { pSource->SetCustomData ( strName, Argument, NULL ); } } } Its just set new value, then triggers on(Client)DataChange event giving to that event new and old value (on that machine where event called). I still need confirmation and advice...
  11. Some new investigation gives answers Looks like setElementData does NOT transfer oldValue. https://code.google.com/p/mtasa-blue/source/browse/trunk/MTA10/mods/deathmatch/logic/rpc/CElementRPCs.cpp void CElementRPCs::SetElementData ( CClientEntity* pSource, NetBitStreamInterface& bitStream ) { unsigned short usNameLength; if ( bitStream.ReadCompressed ( usNameLength ) ) { // We should never receive an illegal name length from the server if ( usNameLength > MAX_CUSTOMDATA_NAME_LENGTH ) { CLogger::ErrorPrintf ( "RPC SetElementData name length > MAX_CUSTOMDATA_NAME_LENGTH" ); return; } SString strName; CLuaArgument Argument; if ( bitStream.ReadStringCharacters ( strName, usNameLength ) && Argument.ReadFromBitStream ( bitStream ) ) { pSource->SetCustomData ( strName, Argument, NULL ); } } } Its just set new value, then triggers on(Client)DataChange event giving to that event new and old value (on that machine where event called). I still need confirmation and advice...
  12. Hello, i doubt with choosing setElementData or triggerServerEvent. As i can see on source code, setElementData is nothing but "OnElementDataChange" event + triggerServerEvent function made in sourcecode by developers themself. https://code.google.com/p/mtasa-blue/source/browse/trunk/MTA10_Server/mods/deathmatch/logic/CElement.cpp void CElement::SetCustomData ( const char* szName, const CLuaArgument& Variable, CLuaMain* pLuaMain, bool bSynchronized, CPlayer* pClient, bool bTriggerEvent ) { assert ( szName ); if ( strlen ( szName ) > MAX_CUSTOMDATA_NAME_LENGTH ) { // Don't allow it to be set if the name is too long CLogger::ErrorPrintf ( "Custom data name too long (%s)\n", *SStringX ( szName ).Left ( MAX_CUSTOMDATA_NAME_LENGTH + 1 ) ); return; } // Grab the old variable CLuaArgument oldVariable; const SCustomData * pData = m_pCustomData->Get ( szName ); if ( pData ) { oldVariable = pData->Variable; } // Set the new data m_pCustomData->Set ( szName, Variable, pLuaMain, bSynchronized ); if ( bTriggerEvent ) { [size=6][b] // Trigger the onElementDataChange event on us CLuaArguments Arguments; Arguments.PushString ( szName ); Arguments.PushArgument ( oldVariable ); Arguments.PushArgument ( Variable ); CallEvent ( "onElementDataChange", Arguments, pClient );[/b][/size] } } My questions 1)If so, even user can make absolutly the same in lua script using tables+register some event like "onCustomMadeDataChangeEvent"+triggerServerEvent/triggerClientEvent functions ? 2) And main: what should i prefer: ready to use "setElementData" or selfmade but doing exactly the same system with triggerServerEvent/triggerClientEvent? First desire is to use setElementData becouse it made in source via c++. BUT! As we can see here CLuaArguments Arguments; Arguments.PushString ( szName ); [b]Arguments.PushArgument ( oldVariable );[/b] Arguments.PushArgument ( Variable ); CallEvent ( "onElementDataChange", Arguments, pClient ); Arguments.PushArgument ( oldVariable ); means we transfer old value EVERYTIME to EVERYCLIENT when element data changed? So, if so, in selfmade triggerServerEvent + arguments i can send only new value value (skip oldValue), saving some bandwidth in each event, each client. Someone can say that it is not critical, but it means that we save 50% bandwidth. Did i understand it correctly? Thanks!
  13. Hello, i doubt with choosing setElementData or triggerServerEvent. As i can see on source code, setElementData is nothing but "OnElementDataChange" event + triggerServerEvent function made in sourcecode by developers themself. https://code.google.com/p/mtasa-blue/source/browse/trunk/MTA10_Server/mods/deathmatch/logic/CElement.cpp void CElement::SetCustomData ( const char* szName, const CLuaArgument& Variable, CLuaMain* pLuaMain, bool bSynchronized, CPlayer* pClient, bool bTriggerEvent ) { assert ( szName ); if ( strlen ( szName ) > MAX_CUSTOMDATA_NAME_LENGTH ) { // Don't allow it to be set if the name is too long CLogger::ErrorPrintf ( "Custom data name too long (%s)\n", *SStringX ( szName ).Left ( MAX_CUSTOMDATA_NAME_LENGTH + 1 ) ); return; } // Grab the old variable CLuaArgument oldVariable; const SCustomData * pData = m_pCustomData->Get ( szName ); if ( pData ) { oldVariable = pData->Variable; } // Set the new data m_pCustomData->Set ( szName, Variable, pLuaMain, bSynchronized ); if ( bTriggerEvent ) { [size=6][b] // Trigger the onElementDataChange event on us CLuaArguments Arguments; Arguments.PushString ( szName ); Arguments.PushArgument ( oldVariable ); Arguments.PushArgument ( Variable ); CallEvent ( "onElementDataChange", Arguments, pClient );[/b][/size] } } My questions 1)If so, even user can make absolutly the same in lua script using tables+register some event like "onCustomMadeDataChangeEvent"+triggerServerEvent/triggerClientEvent functions ? 2) And main: what should i prefer: ready to use "setElementData" or selfmade but doing exactly the same system with triggerServerEvent/triggerClientEvent? First desire is to use setElementData becouse it made in source via c++. BUT! As we can see here CLuaArguments Arguments; Arguments.PushString ( szName ); [b]Arguments.PushArgument ( oldVariable );[/b] Arguments.PushArgument ( Variable ); CallEvent ( "onElementDataChange", Arguments, pClient ); Arguments.PushArgument ( oldVariable ); means we transfer old value EVERYTIME to EVERYCLIENT when element data changed? So, if so, in selfmade triggerServerEvent + arguments i can send only new value value (skip oldValue), saving some bandwidth in each event, each client. Someone can say that it is not critical, but it means that we save 50% bandwidth. Did i understand it correctly? Thanks!
  14. То есть можно сделать башню как отдельный компонент в 3D моделлере, затем скриптово управлять этим компонентом? А какие функции делают это из скриптов (если представить что 3D модель уже есть)? .
  15. Но у того же Rhino модель одна на весь танк. Это rhino.txd и rhino.dff. Для башни же нет отдельной модели.
  16. Я хочу, чтобы в игре было больше одного танка. Сейчас в игре есть только Rhino, ему можно поменять .txd и .dff файлы - будет другая внешность, но танк будет один. Как сделать, чтобы в игре было более одного вида танка? Если заменить у любой машины .txd и .dff на такие же файлы от танка, будет ли новая модель работать как танк (хотя бы будет ли поворачиваться башня)? Как можно обойти это ограничение? Спасибо.
  17. What exactly this script should do? Only replace .tdx and .dff files? Or something else?
  18. Hello. If i replace standart .txd and .dff files of any standart car (i.e. Sultan) appropriate .txd and .dff files of Rhino (tank!) will it act like a tank (collisions, turret etc)? If i replace Rhino's model anyway i will have only 1 tank model in game, but If i want more then 1 tank (models) in game what should i do?
  19. 1. Ты прав, оговорился, имею ввиду "интерфейс" как таковой: прицел и т.д. 2. почему? потому что в мта вообще нет никаких функций для этого? 4. "НЕконтролируемое" в смысле трудно или плохо контролируемое? Каких именно плачевных последствий? Под контролем я имею ввиду изменение направления ствола пулемета по движению мышки игроком, например. 5. Анимации оружия. Анимации транспорта. 6. То есть это все таки возможно, если кто то может?
  20. Привет! Мне нужно полностью изменить военный транспорт в игре. Что и имею ввиду, когда пишу "полностью": новый HUD; новые оружия, установленные на военный транспорт; изменения свойств старого оружия и т.д. Что из этого возможно сделать в это в МТА? Какие инструменты надо использовать? Укажите в какую сторону смотреть(функции, конкретные статьи и т.д.). 1) Полностью заменить HUD военного транспорта. 2) Изменить свойства оружия военного транспорта. 3) Установить новое оружие на транспорт 4) Контролировать это новое оружие 5) Замена анимации всего этого 6) Возможно ли в МТА создать с нуля через программирование новый транспорт? Какие инструменты для этого нужно использовать. Спасибо за ответы!
  21. Totally NEW selfmade vehicle / Total vehicle replacement Hi. I need ABSOLUTLY another HYDRA, PANZER, SEASPARROW and else vehicles (helicopters, aircraft etc...) What do i mean "absolutly": new HUD (aim), new weapon (rockets, machinegun installed on HYDRA), controlling this new weapon, new damage panzer doing etc......) Is it possible in MTA? With what tools? What FUNCTIONS, RESOURCES, KNOWLEDGES, ARTICLES should i use to change this attributes of vehicle OR CREATE it myself?? What tools will be most usefull to do it. 1) new HUD of vehicle (aim, new weapons status etc.).... 2) change properties of standart weapon (HYDRA, PANZER): damage etc. 3) install new weapons on vehicle 4) player control new weapon installed on vehicle 5) control animation of all this 6) What should do: a) change vehicle we already have in MTA b) create absolutly new vehicle programatically (is it possible? with what tools?) Thanks for any suggestions!
×
×
  • Create New...