Witamy w Nieoficjalnym polskim support'cie AMX Mod X
Witamy w Nieoficjalnym polskim support'cie AMX Mod X, jak w większości społeczności internetowych musisz się zarejestrować aby móc odpowiadać lub zakładać nowe tematy, ale nie bój się to jest prosty proces w którym wymagamy minimalnych informacji.
|
Funkcja od 'miejsca spawnu' ? Postawienie NPC na respie.
#1
Napisano 18.05.2012 18:59
Z góry dzięki, pozdrawiam.
Irytuje mnie nieczytelny kod, jeśli oczekujesz ode mnie pomocy - zmień to !
#3
Napisano 18.05.2012 22:55
tu gościu pyta się o przenoszenie na resp przeciwnika, masz tam dużo informacji potrzebnych do tego co chcesz zrobić, praktycznie gotowy kod tylko zamiast ustawiać tam gracza wstawiasz npc
#4
Napisano 18.05.2012 23:00
get_the_spawn(iEnt)
Z góry wielkie dzięki, czegoś takiego szukałem właśnie ; ) Łap plusa, dobrze by było, gdybyś jeszcze mi odpowiedział, chociaż jestem prawie, że tego pewny
Tobie też 'nazwać' wielkie dzięki, widzę ten temat, za***iście, wszystko już praktycznie do tego mam, tylko troszkę to zedytuję bo ent nie ma przypisanej drużyny, ale wywołam to na 2 Ent'y 2 razy, dla Team 1 i Team 2, dzięki bardzo ; )
teleport_to_enemy_spawn(id) {
new origin[3], Float:fl_origin[3], Float:angle[3];
new team = get_user_team(id);
if( team == 1 ) find_free_spawn(2, fl_origin, angle);
else find_free_spawn(1, fl_origin, angle);
FVecIVec(fl_origin, origin);
set_user_origin(id, origin);
set_pev(id, pev_angles, angle);
}
Użytkownik ogieR- edytował ten post 18.05.2012 23:04
Irytuje mnie nieczytelny kod, jeśli oczekujesz ode mnie pomocy - zmień to !
#5
Napisano 19.05.2012 06:54
[code=auto:0]
// tutaj tworzysz sobie 2 npc
new origin_ct[3], Float:fl_origin_ct[[/color]3], Float:angle_ct[3];[/color]
new origin_tt[3], Float:fl_origin_tt[3], Float:angletct[3];
find_free_spawn(1, fl_origin_tt, angle_tt);
find_free_spawn(2, fl_origin_ct, angle_ct);
// w zmiennych fl_origin_ct i tt masz miejsca w które przenieść npc1 i npc2 (dla tero i ct) więc teraz możesz albo posłużyć się set_pev(dlatego dodatkowe 2 zmienne typu int żeby użyć FVecIVec) lub entity_set_float z engine
Użytkownik Jak się nazwać edytował ten post 19.05.2012 06:56
#6
Napisano 19.05.2012 09:29
A co jeśli nie znajdzie wolnego spawn'u ? To wtedy nie pobierze origin'a i angle'sa. Więc trzeba dodać set_task, który powtórzy funkcję szukania wolnego spawn'u gdy nie znajdzie go za pierwszym razem.
Przykład:
new entSpawn = find_free_spawn(team, fl_origin, fl_angle) if(!entSpawn) { //Nie znalazl wolnego spawn'u. Sproboje ponownie za sekunde fm_remove_entity(index_npc) set_task(1.0,"funkcja", team) return; } else //Funkcja od tworzenia NPC }
P.S jak już zrobisz to zapodaj kod ;d
Użytkownik radim edytował ten post 19.05.2012 09:33
Chcąc napisać do mnie prywatną wiadomość, wpierw zapoznaj się ze stroną "O mnie" w moim profilu użytkownika [ radim ] !
#7 Gość_21977_*
Napisano 19.05.2012 18:14
Dokładnie teleport_to_own_spawn(id) lub teleport_to_enemy_spawn(id) teleportuje na resp własny / wroga.
stock const spawnEntString[2][] = {"info_player_start","info_player_deathmatch"}
stock find_free_spawn(iTeamNumber, Float:spawnOrigin[3], Float:spawnAngle[3]){
new iSpawn;
if(iTeamNumber == 2)
iSpawn=0;
else
iSpawn=1;
const maxSpawns = 128;
new spawnPoints[maxSpawns], bool:spawnChecked[maxSpawns], spawnpoint, spawnnum;
new ent = -1, spawnsFound = 0;
while( ( ent = fm_find_ent_by_class(ent,spawnEntString[iSpawn]) ) && spawnsFound < maxSpawns )
spawnPoints[spawnsFound++] = ent;
new Float:vicinity = 100.0; //(32x32x96)
new i, entList[1];
for( i = 0; i<maxSpawns; i++)
spawnChecked[i] = false;
// Loop through all the spawn points
i = 0;
while( i++ < spawnsFound*10 ){
spawnnum = random(spawnsFound);
spawnpoint = spawnPoints[ spawnnum ];
if( spawnpoint && !spawnChecked[spawnnum] ){
//don't check this spawn point again
spawnChecked[spawnnum] = true;
// Get the origin of the spawn point
pev(spawnpoint, pev_origin, spawnOrigin)
// Determine if something is in this near the spawn point
if( !fm_find_sphere_class(0, "player", vicinity, entList, 1, spawnOrigin) ){
// If there is nothing, return the angles and spawnpoint
pev(spawnpoint, pev_angles, spawnAngle);
return spawnpoint;
}
}
}
return 0;
}
stock fm_find_sphere_class(ent, const _classname[], Float:radius, entlist[], maxents, Float:origin[3]={0.0,0.0,0.0}){
if( pev_valid(ent) )
pev( ent, pev_origin, origin );
new tempent, tempclass[32], entsfound;
while( (tempent = fm_find_ent_in_sphere(tempent, origin, radius) ) && entsfound < maxents ){
if( pev_valid(tempent) ){
pev(tempent, pev_classname, tempclass, 31);
if( equal( _classname, tempclass ) )
entlist[entsfound++] = tempent;
}
}
return entsfound;
}
public teleport_to_enemy_spawn(id){
new origin[3], Float:fl_origin[3], Float:angle[3];
new team = get_user_team(id);
// sprite
new Float:fOrigin[3];
pev(id,pev_origin,fOrigin);
fOrigin[2] += 35.0;
message_begin(MSG_BROADCAST,SVC_TEMPENTITY )
write_byte(TE_SPRITE)
write_coord_f(fOrigin[0])
write_coord_f(fOrigin[1])
write_coord_f(fOrigin[2])
write_short(sprPuff)
write_byte(20)
write_byte(255)
message_end()
if( team == 1 ) find_free_spawn(2, fl_origin, angle);
else find_free_spawn(1, fl_origin, angle);
FVecIVec(fl_origin, origin);
set_user_origin(id, origin);
set_pev(id, pev_angles, angle);
}
public teleport_to_own_spawn(id){
new origin[3], Float:fl_origin[3], Float:angle[3];
new team = get_user_team(id);
// sprite
new Float:fOrigin[3];
pev(id,pev_origin,fOrigin);
fOrigin[2] += 35.0;
message_begin(MSG_BROADCAST,SVC_TEMPENTITY )
write_byte(TE_SPRITE)
write_coord_f(fOrigin[0])
write_coord_f(fOrigin[1])
write_coord_f(fOrigin[2])
write_short(sprPuff)
write_byte(20)
write_byte(255)
message_end()
if( team == 1 ) find_free_spawn(1, fl_origin, angle);
else find_free_spawn(2, fl_origin, angle);
FVecIVec(fl_origin, origin);
set_user_origin(id, origin);
set_pev(id, pev_angles, angle);
}
Do tego dodaje ładnego sprite`a (new sprPuff; w globalu i sprPuff = precache_model("sprites/ballsmoke.spr"); w plugin_precache)
Oraz wrzucasz poniższy sprite do folderu sprites/
ballsmoke.spr 53,04 KB 39 Ilość pobrań
Możesz też linijki
// spritepominąć, znika też konieczność precachowania i wgrywania pliku sprite.
new Float:fOrigin[3];
pev(id,pev_origin,fOrigin);
fOrigin[2] += 35.0;
message_begin(MSG_BROADCAST,SVC_TEMPENTITY )
write_byte(TE_SPRITE)
write_coord_f(fOrigin[0])
write_coord_f(fOrigin[1])
write_coord_f(fOrigin[2])
write_short(sprPuff)
write_byte(20)
write_byte(255)
message_end()
Może stocki Ci się przydadzą lub przydadzą się komuś innemu w przyszłości.
Do tego możesz zainstalować plugin spawn_protection, który niweluje problem przepełnionych punktów spawn lub zastosować poprawkę radima.
Użytkownicy przeglądający ten temat: 0
0 użytkowników, 0 gości, 0 anonimowych