Peršokti į turinį
  • ŽAIDIMAI
  • , ŽAIDIMAI
  • ŽAIDIMAI

Ši tema yra neaktyvi. Paskutinis pranešimas šioje temoje buvo prieš 4101 dienas (-ų). Patariame sukurti naują temą, o ne rašyti naują pranešimą.

Už neaktyvių temų prikėlimą galite sulaukti įspėjimo ir pranešimo pašalinimo!

Recommended Posts

(redaguota)

Sveiki.
 
Manau, kad ne tik man žaidžiant bet kokiame serveryje atsiranda tokių idiotų, kurie paima ir išstumdo visas mašinas arba dar blogiau - nustumia tavo nuosavą mašiną į vandenį. Ir šiaip nelogiška, kad tiesiog bėgdamas į mašiną gali ją stumdyti.
 
Tad nusprendžiau parašyti scriptą, kuris neleistų judinti mašinų žaidėjams.
Tai padaryti yra du pagrindiniai būdai:

  • Jei mašina yra nustumta nuo paskutines pozicijos tuomet atstatome poziciją.
  • Jei žaidėjas bando stumti mašiną, tai sustabdome jo judėjimą.

Iš pradžių bandžiau daryti pirmuoju būdu, tačiau susidūriau su keliomis problemomis - SAMP'e neįmanoma nustatyti mašinos pasisukimo kampo, todėl jei mašina stovi ant kokio šlaito ar kalno, tai ją pastūmus jį atsistatys atgal, tačiau mašina sulys į objektus. Tai yra pagrindinė problema.
 
Tuomet sugalvojau antrą būdą, tai tiesiog nutraukti žaidėjo animacijas, jei jis stumdo mašiną. Tai galbūt šiek tiek darko estetinį vaizdą, nes žaidėjas lyg bando bėgti, bet vėl sustoja, tačiau labai gerai atlieka mūsų norimą funkciją. Vienintelis minusas tas, kad šiuo būdu dviračius, motociklus ir spėju kitas labai smulkias (rc cars, priekabos ir t.t.) transporto priemones galima šiek tiek stumdyti. Aišku, vairuojant kitą transportą, niekas nesikeičia - stumdyti galima viską.

Taip pat šis kodas atlieka ir Anti mass car spawn bei anti vehicle teleport to you funkcijas. Jei žaidėjas bando teleportuoti mašiną pas save, tuomet ją atstato į tą pačia poziciją, iš kuriuos ji buvo paimta.
 
Na, einame prie kodo dalies.
 
1. Susikuriam kintamuosius:

// Mašinų kintamieji
enum eVehicleInfo
{
	Float: fVehPos[3], // mašinos koordinates
	Float: fAngle, // mašinos Z pasisukimo kampas
	bool: bUnVehicleUpdateCheck, // kintamasis, kuriuo tikrinsime ar mašiną galima stumdyti (apie tai vėliau)
	bool: bVehicleUpdateCheck, // kintamasis, kuriuo tikrinsime ar galima atnaujinti mašinos pozicija (apie tai vėliau)
	bool: bUsed, // kintamasis, kuriuo tikrinsime ar mašina jau naudota.
	iLastDriverExitTime // paskutinio vairuotojo išlipimo laikas
}
new vInfo[MAX_VEHICLES+1][eVehicleInfo];

// Žaidėjo kintamieji
enum ePlayerInfo
{
	iCarEnterTime, // įlipimo į mašiną laikas
	iLastCarID, // paskutinės vairuotos mašinos ID
	bool: bCarMassSpawnCheater // ar užfiksuotas masinis mašinių teleportavimas
}
new pInfo[MAX_PLAYERS][ePlayerInfo];

Aš kintamuosius kuriu enum'e, nes taip man yra patogiau, tačiau galite sukurti kaip norite arba integruoti į jau esamus enum (playerDB, vehicleDB ir tt).

 

2. Kuriame ir redaguojame stockus, funkcijas:

// Stockas, skirtas gauti mašinos greiti pagal jo velocity.
stock Float: GetVehicleSpeed(vehicleid, Float: vel_x = -1.0, Float: vel_y = -1.0, Float: vel_z = -1.0)
{
	if(vel_x == -1.0)
		GetVehicleVelocity(vehicleid, vel_x, vel_y, vel_z);

	vel_x *= vel_x, vel_y *= vel_y, vel_z *= vel_z;
	return floatsqroot(vel_x + vel_y + vel_z) * 200.0;
}

// Stockas, kuris tikrina ar transporto priemonė nėra specifinė (apie tai vėliau)
stock isVehicleSpecific(vehicleid)
{
	if(!IsValidVehicle(vehicleid))
	    return 0;
	    
	switch(GetVehicleModel(vehicleid))
	{
	    case 449, 537, 538, 553, 569, 570, 577, 592, 608:
	        return 1;
	        
		default:
		    return 0;
	}
	return 0;
}

// stockas, kuris tikrina ar transporto priemonė nėra laivas.
stock isVehicleBoat(vehicleid)
{
	if(!IsValidVehicle(vehicleid))
	    return 0;

	switch(GetVehicleModel(vehicleid))
	{
		case 430, 446, 452, 453, 454, 472,473, 484,493, 595:
			return 1;
		default:
			return 0;
	}
	return 0;
}

// Perkuriame PutPlayerInVehicle funkciją, jog scriptas žinotų, jog žaidėjas įlipo į mašiną normaliu būdu (ne hack'ais).
stock _PutPlayerInVehicle(playerid, vehicleid, seatid)
{
	if(seatid == 0)
		pInfo[playerid][iCarEnterTime] += 221;

	return PutPlayerInVehicle(playerid, vehicleid, seatid);
}

#if defined _ALS_PutPlayerInVehicle
	#undef PutPlayerInVehicle
#else
	#define _ALS_PutPlayerInVehicle
#endif
#define PutPlayerInVehicle _PutPlayerInVehicle

// Perkuriame PutPlayerInVehicle funkciją, jog scriptas žinotų, jog žaidėjas paliko mašiną normaliu būdu (ne hack'ais).
stock _RemovePlayerFromVehicle(playerid, vehicleid)
{
	pInfo[playerid][iCarEnterTime] += 221;
	return RemovePlayerFromVehicle(playerid, vehicleid);
}

#if defined _ALS_RemovePlayerFromVehicle
	#undef RemovePlayerFromVehicle
#else
	#define _ALS_RemovePlayerFromVehicle
#endif
#define RemovePlayerFromVehicle _RemovePlayerFromVehicle

// Perkuriame CreateVehicle funkciją, kad galėtume surašyti koordinates ir kitą informaciją į kintamuosius.
forward _CreateVehicle(vehicletype, Float:x, Float:y, Float:z, Float:rotation, color1, color2, respawn_delay);
public _CreateVehicle(vehicletype, Float:x, Float:y, Float:z, Float:rotation, color1, color2, respawn_delay)
{
	new vehicleid = CreateVehicle(vehicletype, x, y, z, rotation, color1, color2, respawn_delay); // sukuriame transporto priemonę.

        vInfo[vehicleid][bUsed] = false; // nustatome, jog ji dar nebuvo naudota.
	vInfo[vehicleid][fVehPos][0] = x; // įrašome jos X koordinatę į kintamajį.
	vInfo[vehicleid][fVehPos][1] = y; // įrašome jos Y koordinatę į kintamajį.
	vInfo[vehicleid][fVehPos][2] = z; // įrašome jos Z koordinatę į kintamajį.
	vInfo[vehicleid][fAngle] = rotation; // įrašome jos Z pasisukimo kampą į kintamajį.
	vInfo[vehicleid][bUnVehicleUpdateCheck]= false; // nustatome, jog mašinos duomenų negalima atnaujinti, taip pat jos negalima stumdyti (apie tai vėliau)

	return vehicleid;
}
#if defined _ALS_CreateVehicle
	#undef CreateVehicle
#else
	#define _ALS_CreateVehicle
#endif
#define CreateVehicle _CreateVehicle

// Perkuriame AddStaticVehicle funkciją, kad galėtume surašyti koordinates ir kitą informaciją į kintamuosius.
forward _AddStaticVehicle(modelid, Float:spawn_x, Float:spawn_y, Float:spawn_z, Float:angle, color1, color2);
public _AddStaticVehicle(modelid, Float:spawn_x, Float:spawn_y, Float:spawn_z, Float:angle, color1, color2)
{
	new vehicleid = AddStaticVehicle(modelid, spawn_x, spawn_y, spawn_z, angle, color1, color2); // sukuriame transporto priemonę.

	vInfo[vehicleid][bUsed] = false; // nustatome, jog ji dar nebuvo naudota.
	vInfo[vehicleid][fVehPos][0] = spawn_x; // įrašome jos X koordinatę į kintamajį.
	vInfo[vehicleid][fVehPos][1] = spawn_y; // įrašome jos Y koordinatę į kintamajį.
	vInfo[vehicleid][fVehPos][2] = spawn_z; // įrašome jos Z koordinatę į kintamajį.
	vInfo[vehicleid][fAngle] = angle; // įrašome jos Z pasisukimo kampą į kintamajį.
	vInfo[vehicleid][bUnVehicleUpdateCheck]= false; // nustatome, jog mašinos duomenų negalima atnaujinti, taip pat jos negalima stumdyti (apie tai vėliau)

	return vehicleid;
}
#if defined _ALS_AddStaticVehicle
	#undef AddStaticVehicle
#else
	#define _ALS_AddStaticVehicle
#endif
#define AddStaticVehicle _AddStaticVehicle

// Perkuriame AddStaticVehicleEx funkciją, kad galėtume surašyti koordinates ir kitą informaciją į kintamuosius.
forward _AddStaticVehicleEx(modelid, Float:spawn_x, Float:spawn_y, Float:spawn_z, Float:angle, color1, color2, respawn_delay);
public _AddStaticVehicleEx(modelid, Float:spawn_x, Float:spawn_y, Float:spawn_z, Float:angle, color1, color2, respawn_delay)
{
	new vehicleid = AddStaticVehicleEx(modelid, spawn_x, spawn_y,spawn_z, angle, color1, color2, respawn_delay); // sukuriame transporto priemonę.

	vInfo[vehicleid][bUsed] = false; // nustatome, jog ji dar nebuvo naudota.
	vInfo[vehicleid][fVehPos][0] = spawn_x; // įrašome jos X koordinatę į kintamajį.
	vInfo[vehicleid][fVehPos][1] = spawn_y; // įrašome jos Y koordinatę į kintamajį.
	vInfo[vehicleid][fVehPos][2] = spawn_z; // įrašome jos Z koordinatę į kintamajį.
	vInfo[vehicleid][fAngle] = angle; // įrašome jos Z pasisukimo kampą į kintamajį.
	vInfo[vehicleid][bUnVehicleUpdateCheck]= false; // nustatome, jog mašinos duomenų negalima atnaujinti, taip pat jos negalima stumdyti (apie tai vėliau)

	return vehicleid;
}
#if defined _ALS_AddStaticVehicleEx
	#undef AddStaticVehicleEx
#else
	#define _ALS_AddStaticVehicleEx
#endif
#define AddStaticVehicleEx _AddStaticVehicleEx

// Redaguojam SetPlayerPos funkciją
stock SetPos(playerid, Float: posX, Float: posY, Float: posZ)
{
    if(IsPlayerInAnyVehicle(playerid)) // jei žaidėjas mašinoje.
        pInfo[playerid][iCarEnterTime] += 221; // nustatome, kad jis išlipo normaliu būdu.
        
    SetPlayerPos(playerid, posX, posY, posZ);
}
#if defined _ALS_SetPlayerPos
    #undef SetPlayerPos
#else
    #define _ALS_SetPlayerPos
#endif
#define SetPlayerPos SetPos

// Redaguojam SetVehiclePos funkcija.
stock SetVehPos(vehicleid, Float: posX, Float: posY, Float: posZ)
{
    // Nustatome kintamųjų reikšmes.
    vInfo[vehicleid][fPos][0] = posX;
    vInfo[vehicleid][fPos][1] = pos;
    vInfo[vehicleid][fPos][2] = posZ;
        
    SetVehiclePos(vehicleid, posX, posY, posZ);
}

#if defined _ALS_SetVehiclePos
    #undef SetVehiclePos
#else
    #define _ALS_SetVehiclePos
#endif
#define SetVehiclePos SetVehPos

// Redaguojam SetVehicleZAngle funkciją
stock SetVehZAngle(vehicleid, Float: angle)
{
   // Nustatom kintamojo reikšmę.
   vInfo[vehicleid][fAngle] = angle;
   SetVehicleZAngle(vehicleid, angle);
}

#if defined _ALS_SetVehicleZAngle
    #undef SetVehicleZAngle
#else
    #define _ALS_SetVehicleZAngle
#endif
#define SetVehicleZAngle SetVehZAngle

Visas šias funkcijas reiktų dėti failo pradžioje, prieš OnGameModeInit callback'ą.

 

 

3. Jei transporto priemonė sprogsta ir atsiranda iš naujo arba kitu būdu respawninasi, turime nustatyti, jog ji nėra naudota:

public OnVehicleSpawn(vehicleid) // kai transporto priemonė atsispawnina.
{
    vInfo[vehicleid][bUsed] = false; // nustatome, jog ji dar nenaudota.
    return 1;
}

4. Dabar mums reikia tam tikrus duomenis nustatyti, kai žaidėjas įlipa į transporto priemonę ir kai išlipa:

public OnPlayerStateChange(playerid, newstate, oldstate) // kai žaidėjo būsena pasikeičia.
{
        // Tikriname ar žaidėjas tapo vairuotoju.
	if(newstate == PLAYER_STATE_DRIVER)
	{
	       new vehicleid = GetPlayerVehicleID(playerid); // gauname jo mašinos ID.

		if(vehicleid)
		{
		    pInfo[playerid][bCarMassSpawnCheater] = false; // nustatome, jog jis nenaudoja mašinų teleportavimo hack'ų.

      		    pInfo[playerid][iLastCarID] = vehicleid; // nustatome paskutinę vairuotą transporto priemonę.
		    pInfo[playerid][iCarEnterTime] = GetTickCount(); // įrašome įlipimo į mašiną laiką.

		    vInfo[vehicleid][bUsed] = true; // nustatome, jog mašina yra panaudota/naudojama.
		    vInfo[vehicleid][bVehicleUpdateCheck] = false; // nustatome, kad mašinos pozicijos kintamieji bevažiuojant atnaujinami nebus.
		    vInfo[vehicleid][iLastDriverExitTime] = 0; // įrašomas paskutinio vairuotojo išlipimo laikas (kadangi jis viduje, tai 0).

                    // Iškviečiame taimer'į, kuriuo leisime naujinti mašinos pozicijos kintamuosius bevažiuojant (apie tai vėliau).
                    SetTimerEx("timerCanUpdateVehicle", 1500, 0, "d", vehicleid);
		}
	}
	else if(oldstate == PLAYER_STATE_DRIVER) // jei žaidėjas išlipo iš vairuotojo vietos.
	{
                // Tikrina ar žaidėjas išlipo tinkamai, be jokių hack'ų (apie šį tikrinimo būdą parašysiu pabaigoje).
		if(GetTickCount() - pInfo[playerid][iCarEnterTime] >= 220)
		    vInfo[pInfo[playerid][iLastCarID]][bUnVehicleUpdateCheck] = false; // jei taip, nustatome jog mašinos stumdyti neįmanoma ir jog nebūtų tikrinama ar ji pastumta (apie tai vėliau).
		else // jei žaidėjas išlipo netinkamai (per greitai).
		    pInfo[playerid][bCarMassSpawnCheater] = true; // nustatome, jog jis naudojo hack'ą.
	}
	return 1;
}

// Timer'is
forward timerCanUpdateVehicle(vehicleid);
public timerCanUpdateVehicle(vehicleid)
    vInfo[vehicleid][bVehicleUpdateCheck] = true; // nustatome, jog galima atnaujinti mašinos pozicijos kintamuosius bevažiuojant.


4. Taigi, žaidėjas įlipo į mašiną, pradėjo važiuoti. Bet jos pozicijos kintamieji tai nesikeičia. Todėl turime keisti juos su kiekvienu judėsiu. Kam buvo reikalingas tas timer'is ir kintamųjų atnaujinimo blokavimas?

Todėl, kad tam tikri mašinų teleportavimo hack'ai veikia taip, kad hack'eris įlipa į mašiną, nuteleportuoja ją kažkur, išlipa ir nusiteleportuoja į prieš tai buvusią vietą. Tai vyksta labai greitai, tačiau script'as tą fiksuoja. Todėl tam, kad mašinos pozicijos kintamieji nesusigadintų ją teleportuojant kažkur kitur, 1.5 sek. po žaidėjo įlipimo nėra atnaujinami mašinos pozicijos kintamieji.

public OnPlayerUpdate(playerid)
{
	if(IsPlayerInAnyVehicle(playerid)) // tikrinam ar žaidėjas mašinoj.
	{
	    new vehicleid = GetPlayerVehicleID(playerid); // gauname mašinos ID.
	    
	    if(GetPlayerVehicleSeat(playerid) == 0) // tikrinam ar žaidėjas mašinoje.
	    {
	        if(vInfo[vehicleid][bVehicleUpdateCheck]) // tikrinam ar galima atnaujinti duomenis.
	        {
	            GetVehiclePos(vehicleid, vInfo[vehicleid][fVehPos][0], vInfo[vehicleid][fVehPos][1], vInfo[vehicleid][fVehPos][2]); // atnaujinam pozicijos kintamuosius.
		    GetVehicleZAngle(vehicleid, vInfo[vehicleid][fAngle // atnaujinam Z pasukimo kampo kintamajį.
		}
	    }
	}
	return 1;
}

Kaip matote kintamųjų atnaujinimas vyksta tik tada, jei yra leidžiama.

 

5. Priėjome prie svarbiausios vietos - mašinos pastumimo fiksavimo ir anuliavimo.

Tam yra naudojamas OnUnoccupiedVehicleUpdate callback'as.

Šis callback'as iškviečiamas tuomet, kai kažkokia tuščia (be vairuotojo) transporto priemonė juda kito žaidėjo pagalba. Tai yra: žaidėjas stumia ją pėščias arba su mašina, žaidėjas yra arti tos mašinos, kai ji juda ir taip toliau.

 

Dabar paaiškinsiu ką reiškią bUnVehicleUpdateCheck kintamasis arba užrašas "nustatome, jog mašinos stumdyti neįmanoma". Tai nereiškia, kad jos ištikrųju neįmanoma pastumti, tai tiesiog nurodo, kad kol kintamasis bUnVehicleUpdateCheck yra false, tol jokie tikrinimai, ar mašina buvo pastumta nebus atliekami. Šis kintamasis turi reikšme "false" tada, kai:

  • Po mašinos sukūrimo/respawn'o ji krenta ore, ridenasi nuo kalvos ar kaip kitaip keičia savo numatytą poziciją.
  • Žaidėjui išlipus iš mašinos (normaliu būdu).

Jei bUnVehicleUpdateCheck yra false, tuomet yra atnaujinami mašinos pozicijos kintamieji į naują poziciją tol, kol mašinos greitis yra didesnis už 4,5 arba 2,0. Kodėl 4,5 ir 2,0 ? Todėl, kad pastebėjau, kad jei mašina sukurta naujai krenta iš kažkur (pvz sukurta ore arba ant ridenasi nuo kalno), tuomet paskutinis callback'o iškvietimas yra maždaug kai greitis yra apie 4.3 (skirtingoms transporto priemonėms skirtingas, pvz Infernus - 1.8, Bike - 4.4. Bet kad išvengti šiokių tokių nesklandumų, ėmiau 4.5).

Jei mašinos greitis yra mažesnis už 4,5 (jei mašina nenaudota) arba mažesnis už 2,0 (jei naudota), tuomet kintamasis bUnVehicleUpdateCheck nustatomas į true ir jau su sekančiu callback iškvietimu bus tikrinama ar mašina yra pastumta žaidėjo.

public OnUnoccupiedVehicleUpdate(vehicleid, playerid, passenger_seat, Float:new_x, Float:new_y, Float:new_z, Float:vel_x, Float:vel_y, Float:vel_z)
{
   // Jei transporto priemonė yra laivas arba specifinė (apie jas vėliau), tuomet jokie tikrinimai nėra atliekami. Juk laivų stumdyti neįmanoma.    
   if(isVehicleBoat(vehicleid) || isVehicleSpecific(vehicleid))
	    return 1;

    // Sukuriame kintamajį, pagal kurį spręsime ar reikia atnaujinti mašinos kintamuosius ar ne.
    new bool: bUpdateVars = false;

	if(vInfo[vehicleid][bUnVehicleUpdateCheck]) // tikrinam, ar mašiną galima stumdyti
	{
		bUpdateVars = false; // nustatome, kad mašinos informacijos atnaujint nereikės.

                // Tikrinam ar žaidėjas už vairo, jei taip - true, jei ne - false
		new bool: bPlayerIsDriver = false;

		if(GetPlayerState(playerid) == PLAYER_STATE_DRIVER)
		    bPlayerIsDriver = true;

                // Randame atstumą tarp mašinos ir jos paskutinės tikros buvimo vietos.
		new Float: fVehicleDistance;
		fVehicleDistance = GetVehicleDistanceFromPoint(vehicleid, vInfo[vehicleid][fVehPos][0], vInfo[vehicleid][fVehPos][1], vInfo[vehicleid][fVehPos][2]);
                /* Tikriname, ar žaidėjas buvo panaudojęs kažkokius masinio mašinų teleportavimo hack'us.
                Arba jis nėra už vairo ir distancija tarp mašinos ir jos tikros buvimo vietos yra didesnė už 25.0 (tik su hack'ais įmanoma) ARBA atstumas tarp žaidėjo ir naujos mašinos buvimo vietos mažesnis už 5.0 bei žaidėjo greitis didesnis už 0.2 (t.y. žaidėjas yra labai arti mašinos ir juda (greičiausiai stumia mašiną)).
                */
		if(pInfo[playerid][bCarMassSpawnCheater] || (!bPlayerIsDriver && (fVehicleDistance >= 25.0 || (GetPlayerDistanceFromPoint(playerid, new_x, new_y, new_z) < 5.0 && GetPlayerSpeed(playerid) > 0.2))))
		{
                        // Jei buvo panaudoti mašinų teleportavimo hack'ai.
			if(pInfo[playerid][bCarMassSpawnCheater] || fVehicleDistance >= 40.0)
			{
                            // Atstatome mašinos pozicija ir Z pasukimo kampą į tokius kokie buvo prieš naudojant cheatus.
			    SetVehiclePos(vehicleid, vInfo[vehicleid][fVehPos][0], vInfo[vehicleid][fVehPos][1], vInfo[vehicleid][fVehPos][2]);
			    SetVehicleZAngle(vehicleid, vInfo[vehicleid][fAngle]);
			    return 1;
			}

                        // Randame dabartinį mašinos pasisukimo kampą Z.
			new Float: fAngl;
			GetVehicleZAngle(vehicleid, fAngl);
			
                        // Tikrinam mašina pasukta daugiau nei 0.2 kampu arba pastumta daugiau nei 0.2 nuo tikrosios vietos.
			if(floatabs(fAngl - vInfo[vehicleid][fAngle]) >= 0.2 || fVehicleDistance >= 0.2)
			{
                                // Jei taip, tuomet sustabdome žaidėją nuo bėgimo ir nerodome nežymaus mašinos pajudėjimo iš vietos kitiems žaidėjams.
				ClearAnimations(playerid, 1);
    			        return 0;
			}
		}
		else if(bPlayerIsDriver) // jeigu kažkas kitaip nei buvusi sąlyga ir žaidėjas yra už vairo (stumia mašiną su kita mašina ar pan).
			bUpdateVars = true; // nustatome, jog reikės atnaujinti mašinos informaciją.
	}
	else // jei neįmanoma stumdyti mašinos.
	    bUpdateVars = true; // tuomet nustatome, kad reikės atnaujinti mašinos infromaciją.

        // Jei reikia atnaujinti mašinos informaciją.
	if(bUpdateVars)
	{
                // Atnaujinam mašinos poziciją ir Z kampą į naują.
		vInfo[vehicleid][fVehPos][0] = new_x;
		vInfo[vehicleid][fVehPos][1] = new_y;
		vInfo[vehicleid][fVehPos][2] = new_z;
		GetVehicleZAngle(vehicleid, vInfo[vehicleid][fAngle]);
		bUpdateVars = false;

                // Tikrinam: jei mašinos negalima stumdyti ir jos greitis mažesnis už 4.5 bei ji dar nenaudota ARBA mašinos greitis mažesnis už 2.5 ir ji jau naudota, tuomet nustatome, jog mašiną galima stumdyti.
	        new Float: fSpeed = GetVehicleSpeed(vehicleid, vel_x, vel_y, vel_z);

		if(!vInfo[vehicleid][bUnVehicleUpdateCheck])
		    if((fSpeed < 4.5 && !vInfo[vehicleid][bUsed]) || (fSpeed < 2.5 && vInfo[vehicleid][bUsed]))
            	          vInfo[vehicleid][bUnVehicleUpdateCheck] = true;

		return 1;
	}
	return 1;
}

Taigi, jei kažko nepamiršau, tai mūsų scriptas baigtas. Beje, kaip jau turbūt pastebėjote dažnai naudojau žodį "mašina". Tikiuosi visi supranta, kad noriu pasakyti "Transporto priemonė".

 

Kas yra tos specifinės transporto priemonės? Tai toks transportas, kurio aš manau neįmanoma pajudinti arba logiška, jog galima judinti: tramvajus, traukinio lokomotyvas, traukinio lokomotyvas 2, Nevada lėktuvas, traukinio vagonas, traukinio vagonas 2, AT400, Andromada ir laiptai į lėktuvą ( :D).

 

Na, sistema kaip ir baigta, tik joje yra keli niuansai:

  • Kaip jau minėjau, dviračius, motociklus (šiektiek) ir smulkias transporto priemones įmanoma judinti, tačiau ne taip stipriai ir lengvai kaip be sistemos.
  • Kadangi transporto priemonių dydžiai skiriasi, tai skiriasi ir distancijos. Tarkime esant prie Infernus galo, atstumas nuo mašinos centro iki žaidėjo yra apie 5.0. O stovint šalia NRG galo, atstumas nuo centro iki žaidėjo yra gal 2.0. Todėl, jei bėgdami užkliūdysite motociklą, dviratį ar dar kažką, kas gali daug judėti (nuvirsti ar slysti ar dar kažkas), tuomet gali būti, jog jūsų judėjimą stabdys, net ir neesat šalia tos transporto priemonės (bet esant kažkur šalia). Galbūt ateityje šį dalyką ištaisysiu.
  • Pastebėjau, jog spawninat mašiną ore šalia savęs, skiriasi greitis paskutiniame callback iškvietime. Na įsivaizduokime, kad su /vehicle komanda atsispawninome Infernus šalia saves, tačiau ore. Ji krenta ant žemės ir nuolat yra iškviečiamas OnUnoccupiedVehicleUpdate. Jis iškviečiamas tol, kol mašina nustoja judėti. Bet paskutiniame iškvietime mašinos kritimo greitis yra ne 0, o 1.8-9. Tačiau, spawninant dviratį šalią savęs ore, paskutiniame iškvietime jo greitis yra apie 4.0.   Tas, kas iš to? Realiai beveik jokio skirtumo, tačiau, jei cheater'is atsiteleportuos šį infernusą prie savęs, tuomet sistema atiteleportuos jį atgal į vietą, tačiau jis atsiras ne ant žemės, bet šiektiek ore (nes jos kintamųjų atnaujinimas buvo sustabdytas ne jau esant ant žemės, o esant truputį virš jos) ir tik tada nukris.  Na, ištikrųjų labai nedidelė smulkmena, tačiau galbūt šiektiek estetinis vaizdas gadinasi ir galbūt ateityje aš tai ištaisysiu.

 

Šioje sistemoje panaudojau vieną dalyką iš kitos sistemos - tikrinimą ar žaidėjas įlipo/išlipo į/iš transporto priemones normaliais būdais ar su hackais. Nuoroda: http://forum.sa-mp.com/showthread.php?t=303796

 

Na viskas, tutorialas baigtas. Tuos niuansus turbūt lengviau suprasti bandant script'ą serveryje, o ne skaitant :D Tikiuosi nebus per daug sudėtinga viską skaityti, nes kaip visada norėjau parašyt detaliai, bet dėl to galbūt gavosi sudėtingai.

 

Jei radote klaidų, trūksta kažkokio kodo dalies arba kažko nesuprantate - rašykite čia, nes tai ne tik tutorialas, bet dar ir kaip sistemos patikrinimas ( nes testavau būdamas vienas, tad gal kažkas ir neveikia :/).

Redaguota , nario aurimasko
(redaguota)

Taip, kalbu apie nustatymą. Ir taip, apie rootx, y, z. Gal ne taip pavadinau

 

Tuomet tiksliai paaiškink ką tu nori padaryti, aš tai supratau, kad tu nori išgauti kaip mašina stovi ant pievos(kokiu kampu) ar dar kur nors?

 

Nes aš viską, ką kuriu dynamiškai ir nustatinėju, mašinas/objektus darau pagal laipsnius sin/cos pagalba.

Redaguota , nario Tehas

d80ad9ffe9008649b12a4086539a3942137.png

(redaguota)

Taip reiktų išgauti kaip mašina stovi ant pievos. Nes jei nenustatysi mašinos rotacijos, tai gausis kad panaudojus SetVehiclePos toj vietoj, mašina atsistos horizontaliai ir įstrigs į pievos objektą.

 

Tai kaip pagal sin/cos gauti pasisukimą tai gal ir sugalvojau jau, bet kaip jį nustatyt?

 

Nesuprantu "nustatymo" žodžio prasmės, tai jeigu tu išgauni ir turi tikslius duomenis, nes tokius tikrai gali gauti, tai ir nustatyti gali, kadangi įsirašai išgautus duomenis ir jie naujinasi, automatiškai ir statosi/saugosi.

 

Pirma išsigauk ir žiūrėkis, nes tai įmanoma.

Redaguota , nario Tehas

d80ad9ffe9008649b12a4086539a3942137.png

(redaguota)

Man rodos jūs vienas kito nesuprantat. SAMP nėra galimybės išgauti ar tuo labiau panaudoti kitų mašinų kampų išskyrus yaw (SetVehicleZAngle()), daugiausiai ką šiuo atveju galima padaryti, tai šiek tiek padidinti Z koordinatę, kad mašina neįstrigtų į objektus.

 

Kodėl įvardini vien SAMP, kai į jį dar galima įterpti daug visko.. Reikia naudotis ir kitomis žiniomis. Tai ką gauni iš informatikos ir matematikos pamokų. Gali išgauti ar mašina pasisukus į pietryčius, pietvakarius, kad ir mašina apsivertus šonu,stogu, ją galima pastatyti ant ratų.

Redaguota , nario Tehas

d80ad9ffe9008649b12a4086539a3942137.png

(redaguota)

Kodėl įvardini vien SAMP, kai į jį dar galima įterpti daug visko.. Reikia naudotis ir kitomis žiniomis. Tai ką gauni iš informatikos ir matematikos pamokų. Gali išgauti ar mašina pasisukus į pietryčius, pietvakarius, kad ir mašina apsivertus šonu,stogu, ją galima pastatyti ant ratų.

Yra includų, kurie nustato pitch/roll kampus, bet šiuo atveju tas nepadės, kadangi tų kampų panaudoti ir pritaikyti automobiliui paprasčiausiai neįmanoma, nes tokia funkcija neegzistuoja.

Redaguota , nario Justac
(redaguota)

O tai gal galėtum paaiškinti kaip padaryt, kad mašina atsispawnintų ne horizontaliai, o vertikaliai, jei sakai, kad žinai kaip?

 

Nori mašina pastatyti ant ratų iš belekokios pozicijos? Ar nori pastatyti ant bufferio tarkim stačią kaip dicką?

Jeigu nori iš normalios pozicijos mašiną spawnint vertikaliai, tai jau sakiau kaip daryt.

Redaguota , nario Tehas

d80ad9ffe9008649b12a4086539a3942137.png

(redaguota)

Pateik kodą, man irgi įdomu pasidarė. :D

 

Nereikėjo net savo kodo duot, tarkim mašinos priekio pakelimas į orą:

JumpStartCar(vehicleid)
{
new Float:Xv, Float:Yv, Float:Zv, Float:absV;
    GetVehicleVelocity(vehicleid, Xv, Yv, Zv);
    absV = floatsqroot(floatpower(floatabs(Xv),2)+floatpower(floatabs(Yv),2)+floatpower(floatabs(Zv),2));
    if(absV < 0.04)
    {
new Float:Zangle;
GetVehicleZAngle(vehicleid, Zangle);
GetVehicleVelocity(vehicleid, Xv, Yv, Zv);
Xv = (0.11 * floatsin(Zangle, degrees));
Yv = (0.11 * floatcos(Zangle, degrees));
SetVehicleAngularVelocity(vehicleid, Yv, Xv, 0);
    }
    return 1;
}

Vartymai mašinų, galima net sukt ją ore ratu nuotoliniu valdymu 360 laipsnių, galima pastatyt ją ant 2 ratų šonu, tereikia pagalvot.

Redaguota , nario Tehas

d80ad9ffe9008649b12a4086539a3942137.png

Iš samp wiki:

This function has no effect on un-occupied vehicles and does not effect trains.

http://wiki.sa-mp.com/wiki/SetVehicleAngularVelocity

Tad šioje situacijoje tai netinka.

 

Pagalvok labiau, suprasi, kad galima ir be jos. Galimybė tikrinti pozicija prieš stumimą; pamesk į orą ir tam tikrą šoną mašiną kažkiek labiau tuomet, kad jai nereiktu landžioti kažkur. Nu išmąstysi, tai išmastysi, visko galima prigalvoti tavo situacijoje.

d80ad9ffe9008649b12a4086539a3942137.png

(redaguota)

Tai jai mašina stovi ant kelio aš važiuoju su fura ir ja turiu nustumti ji į mane telinas tai vadinas geras sprendimas ?

Kodėl turim saugoti mašinos informacija kaskart kai žaidėjas Updeitinasi, neužtenka palaukti kol jis iš jos išlips ?

 

Ar mašina miršta vandenyje galima patikrinti išgavus z, arba yra spec vandenu zonų includai. Patikrinam ar ji mirus nebuvo naudota ar naudota prieš keles sek kai žaidėjas iš jos iššoko.

Jai iš mašinos žaidėjas išlips ore, tai kas kart ją telinsi atgal į ora, nes ji tuščia krenta ?

 

Nesakau perdaug nieko nes visi čytai turi būti sutvarkyti samp sided, ir tobulo sprendimo nėra, bet kartais gali būti daugiau problemų nei naudos.

Redaguota , nario Expert*

asd1.gif

Ši tema yra neaktyvi. Paskutinis pranešimas šioje temoje buvo prieš 4101 dienas (-ų). Patariame sukurti naują temą, o ne rašyti naują pranešimą.

Už neaktyvių temų prikėlimą galite sulaukti įspėjimo ir pranešimo pašalinimo!

Prisijungti prie diskusijos

Palikti atsakymą galite iš karto, o užsiregistruoti vėliau. Jeigu jau turite paskyrą mūsų forume, Prisijunkite.

Svečias
Atsakyti šioje temoje...

×   Įklijuotas tekstas turi teksto formatavimą.   Pašalinti teksto formatavimą

  Galimi tik 75 veidukai.

×   Nuoroda buvo automatiškai įterpta.   Įterpti nuorodą paprastai

×   Jūsų ankstesnis pranešimas buvo atkurtas.   Išvalyti redaktorių

×   Jūs negalite įkelti nuotraukas tiesiogiai.Įkelkite arba įdėkite nuotraukas iš URL.

  • Šiame puslapyje naršo:   0 nariai

    • Nėra registruotų narių peržiūrinčių šį forumą.

Skelbimai


×
×
  • Sukurti naują...