-
Üdv!
Eléggé régen publikáltam egy script-et Hurt Script néven (a neve rohadtul nem illett hozzá, ezért neveztem most át), és ez annak a frissítése lenne.
V2.0 változásai:
- Kocsiból kirepülés szebbítve, korrigálva.
- Gyalogosként egy új rendszer beiktatva.
- Bugjavítások.
- Enyhe optimalizáláson esett át a script.
- Felállás után is szédül a player egy kis ideig.
Features:
- Ha autóval nekimész egy falnak, vagy egyéb tárgynak, úgy hogy minimum 150-et sebez az autóba, akkor kirepülsz az autó haladási sebességével egyenlõ erõvel.
- Ha kirepülsz autóból, fekve landolsz, és 5 mp-ig nem tudsz felkelni, szédülsz.
- Ha gyalogosként 20, és 40 közötti sebzést kapsz, beszédülsz.
- Ha gyalogosként 40 fölött sebzõdsz kifekszel (fõleg esésre vonatkozik, de lövésre is, ez késõbb változik majd), 5mp-ig nem tudsz felkelni, szédülsz.
- Ha 10, vagy kevesebb életed van, véglegesen szédülsz, amig 10 fölé nem megy az életed.
Videó:
http://www.youtube.com/watch?v=u7Vtrpjd5u4
(a 10 életes dolog nem látható a videóban, de az eddig is benne volt a script-ben)
Letöltés [AMX + PWN]:
http://www.solidfiles.com/d/d333ff99a0/
Forráskód [PWN] (Optimized by Zsolesszka):
#include <a_samp>
new Float:vhealth[MAX_PLAYERS];
new Float:velX[MAX_PLAYERS], Float:velY[MAX_PLAYERS], Float:velZ[MAX_PLAYERS];
forward OnVehicleLoseHealth(playerid, vehid, health);
forward DrunkClean(playerid);
forward Refix(playerid);
forward FallSet(playerid);
forward Controllable(playerid);
public
OnFilterScriptInit()
{
print(\"\\n--------------------------------------\");
print(\" Damage behaviour v2.0 by Fade \");
print(\"--------------------------------------\\n\");
return 1;
}
public
OnPlayerStateChange(playerid, newstate, oldstate)
{
if(newstate == PLAYER_STATE_DRIVER || newstate == PLAYER_STATE_PASSENGER)
{
GetVehicleHealth(GetPlayerVehicleID(playerid), vhealth[playerid]);
}
return 1;
}
public
OnVehicleRespray(playerid, vehicleid, color1, color2)
{
GetVehicleHealth(vehicleid, vhealth[playerid]);
return 1;
}
public
OnVehicleLoseHealth(playerid, vehid, health)
{
if(health >= 150)
{
new
Float:x,
Float:y,
Float:z,
Float:a;
GetVehiclePos(vehid, x, y, z);
GetVehicleZAngle(vehid, a);
SetPlayerPos(playerid, x, y, z+2);
GetVehicleVelocity(vehid, x, y, z);
SetPlayerVelocity(playerid, velX[playerid], velY[playerid], z+1);
SetPlayerDrunkLevel(playerid, 10000);
SetTimerEx(\"FallSet\", 500, 0, \"i\", playerid);
}
if(health >= 500) SetPlayerHealth(playerid, 0);
return 1;
}
public
OnPlayerTakeDamage(playerid, issuerid, Float: amount, weaponid)
{
new
Float:hp;
GetPlayerHealth(playerid, hp);
if(20 <= amount <= 40)
{
SetPlayerDrunkLevel(playerid, 25000);
SetTimerEx(\"DrunkClean\", 5000, 0, \"i\", playerid);
}
else if(40 <= amount <= hp)
{
ClearAnimations(playerid);
TogglePlayerControllable(playerid, 0);
ApplyAnimation(playerid, \"PARACHUTE\", \"FALL_skyDive_DIE\",4,0,0,0,1,0);
SetPlayerDrunkLevel(playerid, 10000);
SetTimerEx(\"Refix\", 5000, 0, \"i\", playerid);
}
return 1;
}
public
Refix(playerid)
{
ApplyAnimation(playerid, \"ped\", \"getup_front\",4,0,0,0,0,0);
SetTimerEx(\"Controllable\",1800,0,\"i\",playerid);
SetTimerEx(\"DrunkClean\",3000,0,\"i\",playerid);
return 1;
}
public Controllable(playerid) return TogglePlayerControllable(playerid, 1);
public FallSet(playerid) return SetPVarInt(playerid, \"FallFromVeh\", 1);
public
DrunkClean(playerid)
{
SetPlayerDrunkLevel(playerid,0);
return 1;
}
public
OnPlayerUpdate(playerid)
{
new
Float:hp;
GetPlayerHealth(playerid, hp);
if(hp >= 99) SetPlayerDrunkLevel(playerid, 0);
else if(hp <= 10) SetPlayerDrunkLevel(playerid, 1000);
new
vehicleid = GetPlayerVehicleID(playerid);
if(vehicleid)
{
GetVehicleHealth(vehicleid, hp);
if(hp != vhealth[playerid])
{
if(hp < vhealth[playerid]) OnVehicleLoseHealth(playerid, vehicleid, floatround(vhealth[playerid] - hp));
vhealth[playerid] = hp;
}
GetVehicleVelocity(vehicleid, velX[playerid], velY[playerid], velZ[playerid]);
}
if(GetPVarInt(playerid, \"FallFromVeh\") == 1)
{
new
Float:vX,
Float:vY,
Float:vZ;
GetPlayerVelocity(playerid ,vX, vY, vZ);
if(vZ == 0)
{
ClearAnimations(playerid);
GetPlayerHealth(playerid, hp);
hp -= 30.0;
SetPlayerHealth(playerid, hp);
if(hp <= 0.0)
{
SetPlayerDrunkLevel(playerid, 0);
} else {
SetPlayerDrunkLevel(playerid, 10000);
SetTimerEx(\"Refix\", 5000, 0, \"i\", playerid);
TogglePlayerControllable(playerid, 0);
ApplyAnimation(playerid, \"PARACHUTE\", \"FALL_skyDive_DIE\",4,0,0,0,1,0);
}
SetPVarInt(playerid, \"FallFromVeh\", 0);
}
}
return 1;
}
A GetXYInFrontOfPlayer függvény tesztnek volt berakva, nem kell vele foglalkozni, komiba raktam.
-
Ez nagyon durva! Szép munka grat! ;)
-
Ez igen szép munka, grat! :)
-
tetszik jó munka grat .d
-
Grat.
Egy pár megjegyzés:
AZ OnPlayerUpdate alatti részt igen csak lehetne optimalizálni.
Az OnPlayerStateChange alatti rész se teljesen korrekt.
Az OnPlayerGetHealth meg nincs használva sehol sem.
Még egy:
Ennek a global változónak a használata meg felesleges. new Float:vhp;
Ha gondolod átírhatom egy általam optimalizált verzióra.
-
Szuper lett! Elismerésem.
-
ez durva! jó munka grat!! 0.3d-re is jó????
-
Grat.
Egy pár megjegyzés:
AZ OnPlayerUpdate alatti részt igen csak lehetne optimalizálni.
Az OnPlayerStateChange alatti rész se teljesen korrekt.
Az OnPlayerGetHealth meg nincs használva sehol sem.
Még egy:
Ennek a global változónak a használata meg felesleges. new Float:vhp;
Ha gondolod átírhatom egy általam optimalizált verzióra.
Megköszönném, mert elég gyorsan írtam így is, kevés idõm van ilyenekre... :D
Az OnPlayerGetHealth valószínüleg azért maradt benne (megint a siedtség), mert 0.3c eleje fele írhattam ezt, akkor ezt kellett használnom, de most már ugye van integrálva ilyen a szerverbe.
Ha átírtad, majd rakd ki ide, berakom fõpostba Zsolesszka edition néven... :)
Amúgy köszi mindenkinek!
-
Ok elvileg meg is lenne gondolkoztam OnVehicleDamageStatusUpdate alkalmazásán is de ahhoz tesztelni kellene. (Az egész a jármû élet csökkenésének megállapításának a ténye.)
Na mindegy a kód optimalizálásán alkottam kicsit, kivettem pár nem használt és felesleges dolgot, és átírtam pár vizsgálatokat. (az OnPlayerUpdate alatt változott talán a legtöbbet)
Lehetne még optimalizálni, de ahhoz több teszt és idõ legfõképp idõ kellene. ;D
Jha igen nem kell a nevemet feltüntetni nem az én szkriptem.
Akkor a változat:
#include <a_samp>
new Float:vhealth[MAX_PLAYERS];
new Float:velX[MAX_PLAYERS], Float:velY[MAX_PLAYERS], Float:velZ[MAX_PLAYERS];
forward OnVehicleLoseHealth(playerid, vehid, health);
forward DrunkClean(playerid);
forward Refix(playerid);
forward FallSet(playerid);
forward Controllable(playerid);
public
OnFilterScriptInit()
{
print(\"\\n--------------------------------------\");
print(\" Damage behaviour v2.0 by Fade \");
print(\"--------------------------------------\\n\");
return 1;
}
public
OnPlayerStateChange(playerid, newstate, oldstate)
{
if(newstate == PLAYER_STATE_DRIVER || newstate == PLAYER_STATE_PASSENGER)
{
GetVehicleHealth(GetPlayerVehicleID(playerid), vhealth[playerid]);
}
return 1;
}
public
OnVehicleRespray(playerid, vehicleid, color1, color2)
{
GetVehicleHealth(vehicleid, vhealth[playerid]);
return 1;
}
public
OnVehicleLoseHealth(playerid, vehid, health)
{
if(health >= 150)
{
new
Float:x,
Float:y,
Float:z,
Float:a;
GetVehiclePos(vehid, x, y, z);
GetVehicleZAngle(vehid, a);
SetPlayerPos(playerid, x, y, z+2);
GetVehicleVelocity(vehid, x, y, z);
SetPlayerVelocity(playerid, velX[playerid], velY[playerid], z+1);
SetPlayerDrunkLevel(playerid, 10000);
SetTimerEx(\"FallSet\", 500, 0, \"i\", playerid);
}
if(health >= 500) SetPlayerHealth(playerid, 0);
return 1;
}
public
OnPlayerTakeDamage(playerid, issuerid, Float: amount, weaponid)
{
new
Float:hp;
GetPlayerHealth(playerid, hp);
if(20 <= amount <= 40)
{
SetPlayerDrunkLevel(playerid, 25000);
SetTimerEx(\"DrunkClean\", 5000, 0, \"i\", playerid);
}
else if(40 <= amount <= hp)
{
ClearAnimations(playerid);
TogglePlayerControllable(playerid, 0);
ApplyAnimation(playerid, \"PARACHUTE\", \"FALL_skyDive_DIE\",4,0,0,0,1,0);
SetPlayerDrunkLevel(playerid, 10000);
SetTimerEx(\"Refix\", 5000, 0, \"i\", playerid);
}
return 1;
}
public
Refix(playerid)
{
ApplyAnimation(playerid, \"ped\", \"getup_front\",4,0,0,0,0,0);
SetTimerEx(\"Controllable\",1800,0,\"i\",playerid);
SetTimerEx(\"DrunkClean\",3000,0,\"i\",playerid);
return 1;
}
public Controllable(playerid) return TogglePlayerControllable(playerid, 1);
public FallSet(playerid) return SetPVarInt(playerid, \"FallFromVeh\", 1);
public
DrunkClean(playerid)
{
SetPlayerDrunkLevel(playerid,0);
return 1;
}
public
OnPlayerUpdate(playerid)
{
new
Float:hp;
GetPlayerHealth(playerid, hp);
if(hp >= 99) SetPlayerDrunkLevel(playerid, 0);
else if(hp <= 10) SetPlayerDrunkLevel(playerid, 1000);
new
vehicleid = GetPlayerVehicleID(playerid);
if(vehicleid)
{
GetVehicleHealth(vehicleid, hp);
if(hp != vhealth[playerid])
{
if(hp < vhealth[playerid]) OnVehicleLoseHealth(playerid, vehicleid, floatround(vhealth[playerid] - hp));
vhealth[playerid] = hp;
}
GetVehicleVelocity(vehicleid, velX[playerid], velY[playerid], velZ[playerid]);
}
if(GetPVarInt(playerid, \"FallFromVeh\") == 1)
{
new
Float:vX,
Float:vY,
Float:vZ;
GetPlayerVelocity(playerid ,vX, vY, vZ);
if(vZ == 0)
{
ClearAnimations(playerid);
GetPlayerHealth(playerid, hp);
hp -= 30.0;
SetPlayerHealth(playerid, hp);
if(hp <= 0.0)
{
SetPlayerDrunkLevel(playerid, 0);
} else {
SetPlayerDrunkLevel(playerid, 10000);
SetTimerEx(\"Refix\", 5000, 0, \"i\", playerid);
TogglePlayerControllable(playerid, 0);
ApplyAnimation(playerid, \"PARACHUTE\", \"FALL_skyDive_DIE\",4,0,0,0,1,0);
}
SetPVarInt(playerid, \"FallFromVeh\", 0);
}
}
return 1;
}
Edit:
Az OnVehicleDamageStatusUpdate nem jó erre a célra mivel nem tartalmazza a jármû élet csökkenését. ( a szkript jármû élet csökkentéshez van írva de lehet ha frontális ütközés lenne ellenõrizve akkor lehet beválna)
Pontosítva: Elõbb kerül meghívásra ez a callback mintsem a jármû élet csökkentésre kerül, tehát alatta a GetVehicleHealth se mûködik megfelelõen.
-
Ezt a repûlést nem lehet egy kicsit lejjebb vinni? Vagyis kb 2 métre lökjön ell?? :D :hmmm:
-
Brutális bazdmeg! Amikor bezzeg kerestem ilyet nem volt!
-
Ezt a repûlést nem lehet egy kicsit lejjebb vinni? Vagyis kb 2 métre lökjön ell?? :D :hmmm:
Azért szerintem nem reális ha 100-al nekimész a falnak, és csak 2 métert repülsz... :D
Jó, végülis ha a fizikában számolunk, ez sem tökéletes, mert csak a sebesség egyenlõ, az erõ-ellenerõ törvényt kevésbé alkalmaztam... (ugye, SA-ban ahhoz meg kéne tudni a jármû tömegét, azt meg nem egyszerû, max egyenletekkel)
Így, csak annyit tudtam megoldani, hogy ugyanolyan sebességgel repülsz ki, mint amekkorával nekicsapódsz.
Ok elvileg meg is lenne gondolkoztam OnVehicleDamageStatusUpdate alkalmazásán is de ahhoz tesztelni kellene. (Az egész a jármû élet csökkenésének megállapításának a ténye.)
Na mindegy a kód optimalizálásán alkottam kicsit, kivettem pár nem használt és felesleges dolgot, és átírtam pár vizsgálatokat. (az OnPlayerUpdate alatt változott talán a legtöbbet)
Lehetne még optimalizálni, de ahhoz több teszt és idõ legfõképp idõ kellene. ;D
Jha igen nem kell a nevemet feltüntetni nem az én szkriptem.
Akkor a változat:
#include <a_samp>
new Float:vhealth[MAX_PLAYERS];
new Float:velX[MAX_PLAYERS], Float:velY[MAX_PLAYERS], Float:velZ[MAX_PLAYERS];
forward OnVehicleLoseHealth(playerid, vehid, health);
forward DrunkClean(playerid);
forward Refix(playerid);
forward FallSet(playerid);
forward Controllable(playerid);
public
OnFilterScriptInit()
{
print(\"\\n--------------------------------------\");
print(\" Damage behaviour v2.0 by Fade \");
print(\"--------------------------------------\\n\");
return 1;
}
public
OnPlayerStateChange(playerid, newstate, oldstate)
{
if(newstate == PLAYER_STATE_DRIVER || newstate == PLAYER_STATE_PASSENGER)
{
GetVehicleHealth(GetPlayerVehicleID(playerid), vhealth[playerid]);
}
return 1;
}
public
OnVehicleRespray(playerid, vehicleid, color1, color2)
{
GetVehicleHealth(vehicleid, vhealth[playerid]);
return 1;
}
public
OnVehicleLoseHealth(playerid, vehid, health)
{
if(health >= 150)
{
new
Float:x,
Float:y,
Float:z,
Float:a;
GetVehiclePos(vehid, x, y, z);
GetVehicleZAngle(vehid, a);
SetPlayerPos(playerid, x, y, z+2);
GetVehicleVelocity(vehid, x, y, z);
SetPlayerVelocity(playerid, velX[playerid], velY[playerid], z+1);
SetPlayerDrunkLevel(playerid, 10000);
SetTimerEx(\"FallSet\", 500, 0, \"i\", playerid);
}
if(health >= 500) SetPlayerHealth(playerid, 0);
return 1;
}
public
OnPlayerTakeDamage(playerid, issuerid, Float: amount, weaponid)
{
new
Float:hp;
GetPlayerHealth(playerid, hp);
if(20 <= amount <= 40)
{
SetPlayerDrunkLevel(playerid, 25000);
SetTimerEx(\"DrunkClean\", 5000, 0, \"i\", playerid);
}
else if(40 <= amount <= hp)
{
ClearAnimations(playerid);
TogglePlayerControllable(playerid, 0);
ApplyAnimation(playerid, \"PARACHUTE\", \"FALL_skyDive_DIE\",4,0,0,0,1,0);
SetPlayerDrunkLevel(playerid, 10000);
SetTimerEx(\"Refix\", 5000, 0, \"i\", playerid);
}
return 1;
}
public
Refix(playerid)
{
ApplyAnimation(playerid, \"ped\", \"getup_front\",4,0,0,0,0,0);
SetTimerEx(\"Controllable\",1800,0,\"i\",playerid);
SetTimerEx(\"DrunkClean\",3000,0,\"i\",playerid);
return 1;
}
public Controllable(playerid) return TogglePlayerControllable(playerid, 1);
public FallSet(playerid) return SetPVarInt(playerid, \"FallFromVeh\", 1);
public
DrunkClean(playerid)
{
SetPlayerDrunkLevel(playerid,0);
return 1;
}
public
OnPlayerUpdate(playerid)
{
new
Float:hp;
GetPlayerHealth(playerid, hp);
if(hp >= 99) SetPlayerDrunkLevel(playerid, 0);
else if(hp <= 10) SetPlayerDrunkLevel(playerid, 1000);
new
vehicleid = GetPlayerVehicleID(playerid);
if(vehicleid)
{
GetVehicleHealth(vehicleid, hp);
if(hp != vhealth[playerid])
{
if(hp < vhealth[playerid]) OnVehicleLoseHealth(playerid, vehicleid, floatround(vhealth[playerid] - hp));
vhealth[playerid] = hp;
}
GetVehicleVelocity(vehicleid, velX[playerid], velY[playerid], velZ[playerid]);
}
if(GetPVarInt(playerid, \"FallFromVeh\") == 1)
{
new
Float:vX,
Float:vY,
Float:vZ;
GetPlayerVelocity(playerid ,vX, vY, vZ);
if(vZ == 0)
{
ClearAnimations(playerid);
GetPlayerHealth(playerid, hp);
hp -= 30.0;
SetPlayerHealth(playerid, hp);
if(hp <= 0.0)
{
SetPlayerDrunkLevel(playerid, 0);
} else {
SetPlayerDrunkLevel(playerid, 10000);
SetTimerEx(\"Refix\", 5000, 0, \"i\", playerid);
TogglePlayerControllable(playerid, 0);
ApplyAnimation(playerid, \"PARACHUTE\", \"FALL_skyDive_DIE\",4,0,0,0,1,0);
}
SetPVarInt(playerid, \"FallFromVeh\", 0);
}
}
return 1;
}
[/quote]
Köszönöm. Azért megemlítettem a neved, hogy te optimalizáltad. :)
-
Ez zsír lett Fade! :D
Valami ilyesmit kerestem!
Szép munka!
-
Ez nagyon fa**a lett ! :D
Szép munka! :)
-
Ez szép Fade,minden elismerésem ;)
-
Szép munka!
-
Ez igen Dani, még mindig viszed a szkriptelést? Emlékszem még amikor pár éve együtt csinálgattunk dolgokat, szép idõk. :) Jó kis szkript, tetszett nagyon ahogy az animációkat használtad, így tovább. ;)
-
Egy kisebb észrevétel:
new vehicleid = GetPlayerVehicleID(playerid);
if(vehicleid)
Ez akkor fog teljesülni, ha az 1-es jármûben ülsz (de még az se biztos). A GetPlayerVehicleID 0-ával tér vissza, ha nem ül, és nagyobb számokkal, ha valamelyikben ül.
-
Egy kisebb észrevétel:
new vehicleid = GetPlayerVehicleID(playerid);
if(vehicleid)
Ez akkor fog teljesülni, ha az 1-es jármûben ülsz (de még az se biztos). A GetPlayerVehicleID 0-ával tér vissza, ha nem ül, és nagyobb számokkal, ha valamelyikben ül.
És, mi a probléma?
Az if true értékkel tér vissza, ha 0-nál nagyobb érték szerepel a feltételben.
Edit:
Ha nem hiszed, akkor teszteld le, íme:
new
vehicleid;
for(new i; i < 100; i++)
{
vehicleid = random(4);
if(vehicleid)
{
printf(\"TESZT: %d\", vehicleid);
}
}
-
Jó lett!
-
Szép :D
Más szó nincs!
-
Jó lett grat
-
Nagyon jó lett gratulálok ;)
-
Ez nagyon szep kis script.RP be idealis, es a samp is egyre jobban hasonlit az igazi elethez.Gratula hozza.