←  Pytania

AMXX.pl: Support AMX Mod X i SourceMod

»

Jak zrobić NPC?

Locked

Optymalny193's Photo Optymalny193 17.05.2011

Cześć
jak zrobić npc na forum?
czyli podejde do czegoś i pokazuje sie menu i wybieram sobie cos
taki ludzik na respie
Posted Image
Quote

  • +
  • -
diablix's Photo diablix 17.05.2011

How To: Make a perfect NPC - AlliedModders

Potem wystarczy find_ent_in_sphere lub podstawowy touch :)
Quote

Optymalny193's Photo Optymalny193 18.05.2011

Dzięki jak bym czegoś nie umial będe pisal PW.
Jak możesz to zajrzyj na PW tego ExpModa.

@@EDIT
Patrz diablix od razu mam dotknięcie :D

public npc_think(id) {
// Put your think stuff here.
entity_set_float(id,EV_FL_nextthink,halflife_time() + 0.01)
}


dodam np. menu(id); i otwiera menu ale duzo roboty xD :D
Edited by Optymalny193, 18.05.2011 13:19.
Quote

mierzwi's Photo mierzwi 18.05.2011

jak dasz otwieranie menu to co chwile będzie ci się od nowa ustawiać dlatego daj jakiś bool jak ma otwarte (na tru), jak wyłączy to na false żeby mu nie resetowało go co chwilę.
Quote

  • +
  • -
diablix's Photo diablix 18.05.2011

Dzięki jak bym czegoś nie umial będe pisal PW.
Jak możesz to zajrzyj na PW tego ExpModa.

@@EDIT
Patrz diablix od razu mam dotknięcie :D


public npc_think(id) {
// Put your think stuff here.
entity_set_float(id,EV_FL_nextthink,halflife_time() + 0.01)
}


dodam np. menu(id); i otwiera menu ale duzo roboty xD :D


To jest think zarejestrowany na byt (klasa npc).
W tym raczej nie wykryjesz człowieka (chyba że wcześniej wspomnianym find_ent_insphere)
Najlepsza metoda to touch (i najoptymalniejsza)
Quote

Optymalny193's Photo Optymalny193 18.05.2011

a jak pobrać zamknięcie menu i dać np.
menu = false;


@UP
I jak dać dokladny kod na pobranie czy to czlowiek bo tutkow nie ma
Quote

mierzwi's Photo mierzwi 18.05.2011

możesz zrobić task i wyszukać, możesz jak diablix mówi touch użyć, a zmienną chyba umiesz dać true/false, jak nie to nie bierz się za to ;d
Quote

Optymalny193's Photo Optymalny193 18.05.2011

Mam tak:

public npc_think(id, ent) {
// Put your think stuff here.
entity_set_float(id,EV_FL_nextthink,halflife_time() + 0.01)

if(JestObokBytu(id, ent, "npc_resp", 45.0)){
//gracz jest obok bytu (w zasiegu 45 unitow)
}
}


I tak


stock bool:JestObokBytu(id, ent, const gszEntClassname[], Float:fDistance){
new szClassname[64];
pev(ent, pev_classname, szClassname, sizeof szClassname - 1);

if(equal(szClassname, gszEntClassname)){
new Float:fOrigin[3];
entity_get_vector(ent, EV_VEC_origin, fOrigin);

if(find_ent_in_sphere(id, fOrigin, fDistance)){
if((1 <= id <= get_maxplayers() && is_user_alive(id)){
return true;
}
}
}
return false;
}

I kod sie nie kompiluje
by diablix.
Quote

  • +
  • -
diablix's Photo diablix 18.05.2011

Mam tak:


public npc_think(id, ent) {
// Put your think stuff here.
entity_set_float(id,EV_FL_nextthink,halflife_time() + 0.01)

if(JestObokBytu(id, ent, "npc_resp", 45.0)){
//gracz jest obok bytu (w zasiegu 45 unitow)
}
}


I tak


stock bool:JestObokBytu(id, ent, const gszEntClassname[], Float:fDistance){
new szClassname[64];
pev(ent, pev_classname, szClassname, sizeof szClassname - 1);

if(equal(szClassname, gszEntClassname)){
new Float:fOrigin[3];
entity_get_vector(ent, EV_VEC_origin, fOrigin);

if(find_ent_in_sphere(id, fOrigin, fDistance)){
if((1 <= id <= get_maxplayers() && is_user_alive(id)){
return true;
}
}
}
return false;
}

I kod sie nie kompiluje
by diablix.



Stock mój ale think nie xD

Musisz walnąć pętle w tym thinku bo on przyjmuje tylko jeden parametr (ent)
Quote

Optymalny193's Photo Optymalny193 18.05.2011

Takie cuś?


public npc_think(id, ent) {

new iPlayers[32], iNum;
get_players(iPlayers, iNum);

for(new g = 0; g<iNum ;g++){

new id = iPlayers[g];

// Put your think stuff here.
entity_set_float(id,EV_FL_nextthink,halflife_time() + 0.01)

if(JestObokBytu(id, ent, "npc_resp", 45.0)){
//gracz jest obok bytu (w zasiegu 45 unitow)
}
}
}


Tylko w tym blad:



stock bool:JestObokBytu(id, ent, const gszEntClassname[], Float:fDistance){
new szClassname[64];
pev(ent, pev_classname, szClassname, sizeof szClassname - 1);

if(equal(szClassname, gszEntClassname)){
new Float:fOrigin[3];
entity_get_vector(ent, EV_VEC_origin, fOrigin);

if((find_ent_in_sphere(id, vOrigin, fDistance))){
if((1 <= id <= get_maxplayers() && is_user_alive(id)){
return true;
}
}
}
return false;
}


Bledy:
Error: Undefined symbol "vOrigin" on line 299
Error: Invalid expression, assumed zero on line 300
Warning: Symbol is never used: "fDistance" on line 306
Quote

  • +
  • -
DarkGL's Photo DarkGL 19.05.2011


bool:JestObokBytu(id, ent, const gszEntClassname[], Float:fDistance){
new szClassname[64];
pev(ent, pev_classname, szClassname, sizeof szClassname - 1);

if(equal(szClassname, gszEntClassname)){
new Float:fOrigin[3];
entity_get_vector(ent, EV_VEC_origin, fOrigin);

new Float:vOrigin[3]
pev(id,pev_origin,vOrigin)

if((find_ent_in_sphere(id, vOrigin, fDistance))){
if(is_user_alive(id)){
return true;
}
}
}
return false;
}
Quote

Optymalny193's Photo Optymalny193 19.05.2011

Ok dzięki
Mam taki kod na npc:

public onna(id) {
new Float:origin[3]
entity_get_vector(id,EV_VEC_origin,origin)
new ent = create_entity("info_target")
new npc = create_entity("info_target")
//give_weapon(ent)
entity_set_origin(ent,origin);
origin[2] += 300.0
entity_set_origin(id,origin)
entity_set_float(ent,EV_FL_takedamage,1.0)
entity_set_float(ent,EV_FL_health,100.0)
entity_set_string(ent,EV_SZ_classname,"npc_resp");

entity_set_int(npc, EV_INT_solid, SOLID_BBOX);

entity_set_model(ent,"models/npc.mdl");
entity_set_int(ent,EV_INT_solid, 2)
entity_set_byte(ent,EV_BYTE_controller1,125);
entity_set_byte(ent,EV_BYTE_controller2,125);
entity_set_byte(ent,EV_BYTE_controller3,125);
entity_set_byte(ent,EV_BYTE_controller4,125);
new Float:maxs[3] = {16.0,16.0,36.0}
new Float:mins[3] = {-16.0,-16.0,-36.0}
entity_set_size(ent,mins,maxs)
entity_set_float(ent,EV_FL_animtime,2.0)
entity_set_float(ent,EV_FL_framerate,1.0)
entity_set_int(ent,EV_INT_sequence,0);
entity_set_float(ent,EV_FL_nextthink,halflife_time() + 0.01)

drop_to_floor(ent)

return 1;

}

public npc_think(id, ent) {

new iPlayers[32], iNum;
get_players(iPlayers, iNum);

for(new g = 0; g<iNum ;g++){

new id = iPlayers[g];

// Put your think stuff here.
entity_set_float(id,EV_FL_nextthink,halflife_time() + 0.01)

if(JestObokBytu(id, ent, "npc_resp", 45.0)){
//gracz jest obok bytu (w zasiegu 45 unitow)
menu(id);
}
}
}


Czy wszystko jest dobrze?
Quote

mierzwi's Photo mierzwi 19.05.2011

szczerze to nie wiem po co ta pętla for(new g = 0; g<iNum ;g++){ i ogólnie to możesz ogarnąć sobie serwer testowy lub new game bo to jest bez sensu pisanie czy to wszystko/czy to działa, bo chyba ty to masz sprawdzać czy to działa, my tylko doradzamy.
Quote

Optymalny193's Photo Optymalny193 19.05.2011

Tak, będe testowal na New Game lecz pytam się czy dobrze napisany
Quote

  • +
  • -
diablix's Photo diablix 19.05.2011

szczerze to nie wiem po co ta pętla for(new g = 0; g<iNum ;g++){ i ogólnie to możesz ogarnąć sobie serwer testowy lub new game bo to jest bez sensu pisanie czy to wszystko/czy to działa, bo chyba ty to masz sprawdzać czy to działa, my tylko doradzamy.


Petla wymagana zeby na graczu uzyc.. sam think przyjmuje tylko jeden parametr (dany byt)
Quote

  • +
  • -
Whisper's Photo Whisper 20.05.2011

Przepraszam, że się wetnę w temat ale potrzebuje jednej rzeczy dot. NPC (zakładałem temat ale była jedna odpowiedź z linkiem do tutoriala)

Wklejka 130175529314842 - AMXX.pl: Support AMX Mod X

Jak pobrać ID atakującego naszego NPC?

I jeszcze jak zapisać miejsce [pozycję] tego NPC, żeby pojawiał się powiedzmy co minute.
Edited by Whisper, 20.05.2011 09:24.
Quote

mierzwi's Photo mierzwi 20.05.2011

to jak think przyjmuje 1 parametr to po co public npc_think(id, ent) ? nie ogarniam was xD ;d
==
Quote

  • +
  • -
diablix's Photo diablix 20.05.2011

to jak think przyjmuje 1 parametr to po co public npc_think(id, ent) ? nie ogarniam was xD ;d
==


A o to to już pytaj autora tematu xD
Quote

Optymalny193's Photo Optymalny193 20.05.2011

co do pierwszego Whisper to to:

new attacker = read_data( 1 );
Quote

  • +
  • -
diablix's Photo diablix 20.05.2011

co do pierwszego Whisper to to:


new attacker = read_data( 1 );


Nie trzeba nic nowego tworzyć skoro już jest parametr attacker w Ham_TakeDamage
Quote
Locked