Назад

расстановка НПС рандомно. возможно ли?

Автор: michail666777: Дата: 01.29.2011

Есть ли возможность расставлять НПС не по координатам, а что бы они расставлялись сами рандомно после запуска сервера?

Автор: sam3000: Дата: 01.29.2011

Есть варианты как предложили выше. OnInit и генерить рандомных НПСей.
А можно исходник поправить :)

Автор: michail666777: Дата: 01.29.2011


- script random -1,{
Oninit:
monster "prontera",0,0,"Нажми на меня",2341,23,"Idiot::tymudak";
end;
}

- script Idiot -1,{
tymudak:
mes "Ты нахрена на меня нажал?";
close;
}



То есть мне нужно добавить в клиент спрайт моба в виде НПС, прописать его на сервер и вписать в скрипт ID и количество?
Я правильно понял идею?

PS Боюсь править исходники я пока не научился.

Автор: Мяфк: Дата: 01.29.2011

Да, так же сделать его не подвижным и с 1 всех стат.

Автор: michail666777: Дата: 01.29.2011

А можно исходник поправить

А есть какой-нибудь гайд и желательно поближе к моей теме? Или это слишком для скромного юзера со средненькими знаниями?)))

Автор: michail666777: Дата: 01.29.2011

Огромное спасибо Olga с eA форума.
Вот предложенный ей вариант:

Открываем .../src/map/npc.c
В функции npc_parse_script меняем:


int i;

на
int i=0;

после:

{// no OnTouch area
class_ = atoi(w4);
nd->u.scr.xs = -1;
nd->u.scr.ys = -1;
}

пишем:

if( x==-1 && y==-1)
do{
x=rand()%(map[m].xs-2)+1;
y=rand()%(map[m].ys-2)+1;
}while(map_getcell(m,x,y,CELL_CHKNOPASS) && (i++)<1000 );

Пример заголовка нпц:

izlude,-1,-1,4 script SomeNPC 56,{

Автор: Renegade: Дата: 01.29.2011

зачем если можно заставить нпц постоянно ходить в рендомном направлении? те он просто гуляет по локации.

Автор: michail666777: Дата: 01.29.2011

Я изначально хотел не задавать координаты потому, что мне нужно что бы на карте появлялись NPC в количестве 500+ штук. И расставлять для каждого координаты было бы до глупости утомительно. Поэтому и хотелось задав координаты рандома - заставить их появляться в любом месте (не важно каком).

То биш если заставить NPC появляться и гулять по всей локации они появлялись бы из одного места, а это не то, чего бы мне хотелось.

Автор: sam3000: Дата: 01.29.2011

Стоит еще добавить проверку, вдруг на клетке уже НПСя, хотя если они ходить будут, думаю это лишнее.

А есть какой-нибудь гайд и желательно поближе к моей теме? Или это слишком для скромного юзера со средненькими знаниями?)))

Даже не пришлось открывать исходник... эх...

Автор: Мяфк: Дата: 01.29.2011

Молодец, может мне в будущем пригодиться. Эх ввели бы в еА это всё официально, полезно же...

Автор: michail666777: Дата: 01.29.2011

хотя если они ходить будут, думаю это лишнее.

Не лишнее... Они не должны были ходить.
А как лучше сделать проверку в этом случае?

Автор: sam3000: Дата: 01.30.2011

+	int h, m;
+ char output[256];
+ bool temp_check = false;
+ struct npc_data *nd = NULL;
+ int min_distance_npc = 3; // минимальное расстояние до НПЦ, 1 - соседняя клетка

+	m = sd->bl.m;
+ // Дополнительные проверки при открытии магазина [KarLaeda]
+ for (h = 0; h < map[m].npc_num; h++) {
+ nd = map[m].npc[h];
+ if (abs(sd->bl.x - nd->bl.x) < min_distance_npc && abs(sd->bl.y - nd->bl.y) < min_distance_npc) {
+ sprintf(output, "Расстояние до НПЦ меньше минимального (%d)", min_distance_npc);
+ clif_displaymessage (sd->fd, output);
+ return;
+ }
+ }

Кусок кода Карлаеды от вендинг зон. Что-то типа этого. Хотя не знаю это актуально под текущие еА. И мб там есть функции: на х у есть ли НПСя?

Нашел парочку, мб пригодятся
int npc_check_areanpc(int flag, int m, int x, int y, int range)
struct npc_data* npc_checknear(struct map_session_data* sd, struct block_list* bl)

Автор: michail666777: Дата: 01.30.2011


OnInit:
do {
set .@x, rand(400);
set .@y, rand(400);
}
while (!checkcell("prontera",.@x,.@y,cell_chkpass));
movenpc strnpcinfo(0),.@x,.@y;
end;


Это решение всех проблем!! Огромное спасибо eA форуму!))

Автор: sam3000: Дата: 01.30.2011

Цитата michail666777;32032:
Это решение всех проблем!! Огромное спасибо eA форуму!))

Исходником лучше :)