Jump to content

Snažší sestavování car offsetů pro objekty


ATomas

Recommended Posts

Zdravím,

určité, když jste objevili nové objekty, které je možné připnout na vozidla (například taxi označení). Určitě jste si všimli, že velikosti vozidel nejsou stejné a tak se stávalo, že když objekt na jednom vozidle krásně drží, na jiném levituje nebo je zapuštěn ve střeše.

Určité jste přišli nato, že je potřeba pro každé vozidlo zvlášť naukládat tyto pozice (offset). Jistě Vás napadla funkce GetVehicleModelInfo s indexem 0, tedy pro rozměry, ale při jejím použitím jste zjistili, že funkce vrací maximální rozměry vozidla, a tedy objekt v některých případech opět levituje.

 

Tento skript jsem používal ještě před vytvoření funkce GetVehicleModelInfo. Jde o zjednodušení vytvoření seznamu těchto offsetů.

 

V praxi stačí prostě nastoupit do vozidla, a příkazem nastavit správné offsety, u každého vozidla se pamatuje poslední nastavení, až takto budou nastaveny všechny offsety, stačí si seznam nechat vypsat do souboru, a rovnou to bude v pawno zápise pro proměnu, a stačí jen skopírovat.

 

new Float:OffsetX[212],Float:OffsetY[212],Float:OffsetZ[212];//modely vozidel jsou od 400 do 611 proto 212

dcmd_setoff(playerid,params[])
{
   new vehicleid = GetPlayerVehicleID(playerid);//protoze id vozidla budeme pouzivat vicekrat, ulozime si ho do promene
   new model = GetVehicleModel(vehicleid);//to same v modelem
   new pos = chrfind(' ',params)+1;//najdeme prvni mezeru v textu
   new pos2 = chrfind(' ',params,pos)+1;//najdemte treti mezeru v textu
   if(!params[0] || pos == 0 || pos2 == 0) return SendClientMessage(playerid,0xFF0000FF,"Použití: /setoff x y z");//pokud nejsou zadany vsechny 3 offset hodnoty

   OffsetX[model-400] = floatstr(params);//prvni je x a zacina ihned, takze funkci floatstr prevedeme text na desetine cislo
   OffsetY[model-400] = floatstr(params[pos]);//druhe je y. pos je startovni znak prvni mezery, tedy druheho parametru.
   OffsetZ[model-400] = floatstr(params[pos2]);//a treti z

   if(GetPVarInt(playerid,"TestObj1") > 0)//pokud prikaz jsme uz pouzili, urcite existuje objekt ktery neni na svem miste, aby nam neprekazel, znicime ho
   {
       DestroyObject(GetPVarInt(playerid,"TestObj1"));
   }
   new obj1 = CreateObject(19482,0,0,0,0,0,0);//vytvorime objekt, id si je potreba zde doplnit
   AttachObjectToVehicle(obj1,vehicleid,OffsetX[model-400],OffsetY[model-400],OffsetZ[model-400],0,0,0);//upneme objekt k vozidlu s nami zadanymi parametry
   SetPVarInt(playerid,"TestObj1",obj1);//ulozime si ID objektu, pro jeho pripadne smazani
   return 1;
}

dcmd_saveoff(playerid,params[])
{
   #pragma unused params
   SendClientMessage(playerid,-1,"Ukladam");
   new File:SaveFile = fopen("OffSety.txt",io_write);//Nazev souboru kam budeme obsah ukladat
   for(new i;i<212;i++)
   {
       new var[64];
       format(var,sizeof(var),"{%.f,%.f,%.f},//%d\r\n",OffsetX[i],OffsetY[i],OffsetZ[i],400+i);//zde je samotny kod, ktery pouzimeje v pawnu, obsahuje vsechny 3 offsety a pro informaci i id modelu vozidla.
       fwrite(SaveFile,var);//zapiseme dosazeny text
   }
   fclose(SaveFile);//dulezite je soubor uzavrit, aby nedoslo k padu serveru
   SendClientMessage(playerid,-1,"Ulozeno");
   return 1;
}

Tak a nyní jen stačí skopirovat txt ze souboru a udělat z toho proměnou, příklad:

new Float:OffSety[212][3] = {//modelu vozidel je 212 a offsety jsou 3 (x y z)
//sem vlozite obsah souboru
};

A hurá mate seznam offsetu pro každé vozidlo a můžete ho použit. Příklad pro vozidlo buffalo (402):

AttachObjectToVehicle(obj,vehicleid,OffSety[402-400][3],OffSety[402-400][3],OffSety[402-400][3],0,0,0);
//402-400, umyslne jsem to takto zapsal, aby bylo jasne, ze je potreba od modelid odecist 400, protoze promena zacina od cisla 0, ale modely zacinaji od 400.

Pokud je potřeba, dají se tam přidat i rotace.

 

K čemu je to dobré? Takto si lze naukládat offsety pro označení taxi, nebo objektu, které následně využijete jako text.

Link to comment
Share on other sites

Zrejme tu funkci GetVehicleModelInfo neumis spravne pouzit. Vystupni data z teto funkce jsou naprosto presna, jsou prevzata z map editoru od Jerneje. Takze nevidim duvod, proc by nekdo mel ztracet cas rucnim ukladanim souradnic pro kazdy model.

Link to comment
Share on other sites

  • Globální moderátor

pěkné :) velmi jinak nemá být u:

 

new pos = chrfind(' ',params)+1;//najdeme prvni mezeru v textu

 

druhá mezera? ta první je definována dcmd ne?

Link to comment
Share on other sites

pěkné :) velmi jinak nemá být u:

 

new pos = chrfind(' ',params)+1;//najdeme prvni mezeru v textu

 

druhá mezera? ta první je definována dcmd ne?

Podle toho jak to beres, ja mnel na mysli prvni mezeru v params, kterou odesila dcmd, tedy uz bez mezery

 

 

Zrejme tu funkci GetVehicleModelInfo neumis spravne pouzit. Vystupni data z teto funkce jsou naprosto presna, jsou prevzata z map editoru od Jerneje. Takze nevidim duvod, proc by nekdo mel ztracet cas rucnim ukladanim souradnic pro kazdy model.

Pouzil jsem ji takto:

new Float:x,Float:y,Float:z;

GetVehicleModelInfo(model,VEHICLE_MODEL_INFO_SIZE,x,y,z);

U vozidla remington mi to odeslalo spravny rozmer, ale u vozidla Rumpo,stretch,burrito mi to zvetsilo rozmer o 0.2. U Landstalker o 0.15. Tak by mne zajimalo, kde jsem udelal chybu.

 

na příkladu:

prikaz:texttest(playerid,params[])
{
new Float:x,Float:y,Float:z,vehicleid = GetPlayerVehicleID(playerid);
GetVehicleModelInfo(GetVehicleModel(vehicleid),VEHICLE_MODEL_INFO_SIZE,x,y,z);
new obj1 = CreateObject(19482,0,0,0,0,0,0);
new obj2 = CreateObject(19482,0,0,0,0,0,0);
SetObjectMaterialText(obj1,params,0,OBJECT_MATERIAL_SIZE_512x512,"Arial",32,1,0xFF000000,0,OBJECT_MATERIAL_TEXT_ALIGN_CENTER);
SetObjectMaterialText(obj2,params,0,OBJECT_MATERIAL_SIZE_512x512,"Arial",32,1,0xFF000000,0,OBJECT_MATERIAL_TEXT_ALIGN_CENTER);
AttachObjectToVehicle(obj1,vehicleid,floatdiv(x,2),0,0,0,0,0);
AttachObjectToVehicle(obj2,vehicleid,-floatdiv(x,2),0,0,0,0,180);
return 1;
}

to u zminovaneho remingtonu objekt prilepi presne na bok vozidla, ale u te dodavky ti to ten objekt da 0.1 od boku vozidla dal, z toho jsem usoudil ze jsou souradnice nepresne.

 

Není to moje první zkušenost, kdy jsem objevil chybu funkce, další chyba je u GetVehicleComponentType kde u componentu 1100,1123,1125 to misto slotu světel odesíla nárazníky.

Link to comment
Share on other sites

U vozidla remington mi to odeslalo spravny rozmer, ale u vozidla Rumpo,stretch,burrito mi to zvetsilo rozmer o 0.2. U Landstalker o 0.15. Tak by mne zajimalo, kde jsem udelal chybu.

 

Musis si uvedomit, ze nektere modely vozidel nejsou porad stejne, ale maji vice variant (napr. NRG, FCR, Burrito, Rumpo apod.). Takze ta funkce vraci souradnice dle aktualni varianty modelu.

 

Není to moje první zkušenost, kdy jsem objevil chybu funkce, další chyba je u GetVehicleComponentType kde u componentu 1100,1123,1125 to misto slotu světel odesíla nárazníky.

 

Jenze to neni zadna chyba funkce. V datovych souborech jsou objekty rozliseny dle typu, mezi svetla patri pouze objekty 1013 (lgt_b_rspt) a 1024 (lgt_b_sspt), tebou zminovane objekty 1100 (misc_c_lr_rem1), 1123 (misc_c_lr_rem2) a 1125 (misc_c_lr_rem3) zkratka zadny typ prirazen nemaji a GTA je detekuje jako narazniky.

Link to comment
Share on other sites

Musis si uvedomit, ze nektere modely vozidel nejsou porad stejne, ale maji vice variant (napr. NRG, FCR, Burrito, Rumpo apod.). Takze ta funkce vraci souradnice dle aktualni varianty modelu.

 

 

 

Jenze to neni zadna chyba funkce. V datovych souborech jsou objekty rozliseny dle typu, mezi svetla patri pouze objekty 1013 (lgt_b_rspt) a 1024 (lgt_b_sspt), tebou zminovane objekty 1100 (misc_c_lr_rem1), 1123 (misc_c_lr_rem2) a 1125 (misc_c_lr_rem3) zkratka zadny typ prirazen nemaji a GTA je detekuje jako narazniky.

V praxi ovsem jsou vyuzity pro slot svetel (viz tunirny v singleplayeru) i kdyz ve sve podstate jsou narazniky, pro spravnou pouzitelnost, musi byt na svetlech. Potom se to pri zjisotvani tuningu na slotu krizi. Tedy pri ukladani tuningu vozidla remingron je potreba funkci "upravit", aby to ukladalo narazniky a zaroven i svetla.

Musis si uvedomit, ze nektere modely vozidel nejsou porad stejne, ale maji vice variant (napr. NRG, FCR, Burrito, Rumpo apod.). Takze ta funkce vraci souradnice dle aktualni varianty modelu.

To sice ano, ale šířka vozidel jako burrito, rumpo, a ani NRG se nemeni. U burrita se nekdy objevi kridlo a svetla nekdy ne, proto u offset Z bych to pochopil , ale X se preci nemeni.

Link to comment
Share on other sites

Opet tlacitko upravit zmizelo...

 

Mne zajima, jak by jsi toto vyresil pomoci te fukce GetVehicleModelInfo, aby to nebylo u kazdeho vozidla v jinak daleko, nez je jeho skutecny rozmer, kdyz tvrdis ze neni poreba delat rucne seznam.

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...