Skocz do zawartości

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.
  • Rozpoczynaj nowe tematy i odpowiedaj na inne
  • Zapisz się do tematów i for, aby otrzymywać automatyczne uaktualnienia
  • Dodawaj wydarzenia do kalendarza społecznościowego
  • Stwórz swój własny profil i zdobywaj nowych znajomych
  • Zdobywaj nowe doświadczenia

Dołączona grafika Dołączona grafika

Guest Message by DevFuse
 

Zdjęcie

Funkcja od 'miejsca spawnu' ? Postawienie NPC na respie.


  • Nie możesz napisać tematu
  • Zaloguj się, aby dodać odpowiedź
6 odpowiedzi w tym temacie

#1 ogieR8

    Wszechmogący

  • Power User

Reputacja: 203
Profesjonalista

  • Postów:641
  • Imię:Mariusz
  • Lokalizacja:Ruda Śląska
Offline

Napisano 18.05.2012 18:59

~ Witam. Czytałem o tym kiedyś, jeden z wyższych pokazał taką funkcję, jednakże nie umiem jej znaleść, a bardzo mi teraz zależy, chciałbym postawić NPC na respie, który zawsze jest na respie, już przeglądałem temat [SURF] Deska, tam po wpisaniu komendy respi się NPC w tym miejscu i zapisuję te współrzędne i tam się NPC pojawia, ale mnie to nie za bardzo zadowala, bo często będzie duzo nowych mapek na moim serverze itd i bardzo mi to będzie przeszkadzało, szukałem tego w PoKeMoD'zie, bo tam chyba takie coś jest, że NPC się sam na respawnach ustawia, ale.. też mam problem. Nie umiem tego znaleść tam, ech. Może ktoś zna tą funkcję i mi zapoda ? Albo poda troszkę inne rozwiązanie ? Jak coś ma być osobny NPC na respie CT i TT.

Z góry dzięki, pozdrawiam.
  • +
  • -
  • 0

Irytuje mnie nieczytelny kod, jeśli oczekujesz ode mnie pomocy - zmień to !


#2 radim

    Godlike

  • Moderator

Reputacja: 939
Master

  • Postów:2 725
  • Steam:steam
  • Imię:Arkadiusz
  • Lokalizacja:Janów Lub.
Offline

Napisano 18.05.2012 22:50

Stocki i "zastosowanie" tych stocków, które na 100% Ci się przydadzą na znalezienie wolnego miejsca spawn'u dla NPC.
Spoiler

  • +
  • -
  • 2

Chcąc napisać do mnie prywatną wiadomość, wpierw zapoznaj się ze stroną "O mnie" w moim profilu użytkownika [ radim ] !


#3 Jak się nazwać

    Wszechmogący

  • Power User

Reputacja: 169
Profesjonalista

  • Postów:617
  • Imię:a
  • Lokalizacja:a
Offline

Napisano 18.05.2012 22:55

http://forums.allied...ead.php?t=72767
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
  • +
  • -
  • 1
Pisze na zamówienie statystyki pod nvault. GG: 15600964

#4 ogieR8

    Wszechmogący

  • Autor tematu
  • Power User

Reputacja: 203
Profesjonalista

  • Postów:641
  • Imię:Mariusz
  • Lokalizacja:Ruda Śląska
Offline

Napisano 18.05.2012 23:00

I rozumiem spawnuje enta dzięki:

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

  • +
  • -
  • 0

Irytuje mnie nieczytelny kod, jeśli oczekujesz ode mnie pomocy - zmień to !


#5 Jak się nazwać

    Wszechmogący

  • Power User

Reputacja: 169
Profesjonalista

  • Postów:617
  • Imię:a
  • Lokalizacja:a
Offline

Napisano 19.05.2012 06:54

Nie musisz przypisywać drużyny npc. Użyj tylko tych stocków do pobrania wolnego spawnu dla ct i dla tero i odpowiedniego npc przenieś do ct i do tero:
[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

  • +
  • -
  • 0
Pisze na zamówienie statystyki pod nvault. GG: 15600964

#6 radim

    Godlike

  • Moderator

Reputacja: 939
Master

  • Postów:2 725
  • Steam:steam
  • Imię:Arkadiusz
  • Lokalizacja:Janów Lub.
Offline

Napisano 19.05.2012 09:29

@up
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

  • +
  • -
  • 1

Chcąc napisać do mnie prywatną wiadomość, wpierw zapoznaj się ze stroną "O mnie" w moim profilu użytkownika [ radim ] !


#7 Gość_21977_*

  • Gość

Reputacja: 0

Offline

Napisano 19.05.2012 18:14

Tutaj masz ode mnie stocki, które pisałem na podstawie kilku funkcji z AM i AMXX.pl, których regularnie używam i zdają się działać poprawnie.
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/

Załączony plik  ballsmoke.spr   53,04 KB  39 Ilość pobrań


Możesz też linijki
 // 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()
pominąć, znika też konieczność precachowania i wgrywania pliku sprite.
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