Перейти к содержанию

Fox RM

Проверенные
  • Постов

    250
  • Зарегистрирован

  • Посещение

  • Победитель дней

    119

Весь контент Fox RM

  1. Fox RM

    5 обезьян и AK47

    Незнаю почему , но видео убило
  2. Fox RM

    Гайд по установке Flux CP

    Ну что ж, всем привет. Как всем известно, есть масса различных контроль-панелей для РО. Сегодня речь пойдёт о Flux CP. И так коротко о панели(что в ней вообще есть): 1)База данных по мобам 2)База данных по предметам 3)ТОПы 4)Отображение онлайна(статус серверов) 5)Отображение локаций и колличества народа на них 6)Почтовая служба 7)Если сервак донатовый - есть специальный модуль доната 8)Ну и еще много всяких вкусностей Минус панели - она не понимает никакой кодировки, кроме UTF-8 (то есть, чтоб у Вас отображался русский текст-ставьте кодировку заранее и далее печатайте всё, что вам нужно, аналогично с базами, если хотите чтоб в рейтингах отображались русские имена чаров - сделайте выход с базы под кодировку UTF-8) Сразу скажу - данная панель работает только с SQL версиями афины. И так приступим. Вопрос: Где её взять? Ответ: тут Инсталляция: В принципе ничем не отличается от стандартной инсталяции той же самой Eyex CMS. То есть всё делается через браузер, но перед этим нам придётся сделать кое какие настройки. И так, куда закидывать я думаю понятно (кому не понятно - Папка www, если используете Вертриго), далее лезем в папку config и там ищем файл с именем application.php. Открываем (для работы с подобными файлами я всё же настоятельно рекомендую использовать программу Notepad++ скачать которую можно отсюда) и ищем строку 'ServerAddress' => 'localhost', 'BaseURI' => '~kuja/flux', 'InstallerPassword' => 'secretpassword', что это? Всё очень даже просто! В графе 'ServerAddress' => 'localhost', прописываем адрес сервера (мойсервер.ru) В графе 'BaseURI' => '~kuja/flux', куджафлюкс убираем вообще нафиг, ибо оно нам не нужно, и в графе 'InstallerPassword' => 'secretpassword', вместо secretpassword пишем свой пароль. Запоминаем его, сохраняем. Теперь в той же папке конфига ищем файл с именем servers.php. С этим файлом я думаю проблем не возникнет, так как он отвечает за привязку к базе. Прописываем логины и пароли к базе, сохраняемся, выходим. Далее открываем браузер и набираем адрес своего сервака (рекомендую сначала всё настраивать на локалхосте 127.0.0.1) ,далее он попросит пароль к инсталлеру (тот самый что мы прописывали). Вводим и апдейтим. Всё, у нас всё встало и готово к работе=)) Пользуйтесь на здоровье, и если возникнут вопросы - пишите, отвечу)) by Shinjuro.
  3. в Статье помоему указаны примеры, или ты хочешь полный пример npc?
  4. Небольшой обзорчик по переменным, а именно, по тем, что чаще всего используются. Начнем. 1. Персонаж. •Если нам необходимо (как пример) чтоб персонаж мог поговорить с НПСом 1 раз (другими словами пройти квест только один раз, или первую ступень квеста) то необходимо присваивать постоянные чар переменные. Как они выглядят: Переменная может принимать только числовые значения. •Если нам необходимо временно выделить персонажа, или наделить его возможностью говорить с каким-нибудь НПСом (пример: разрешить персонажу пользоваться премиум-варпером до следующего входа в игру) то нужно вешать временные чар. переменные: Такая переменная сотрется из базы сразу же, как чар покинул игру. •Если же мы хотим, чтоб только один персонаж со всего аккаунта мог пройти скажем определенный квест, то нужно вешать перманентную аккаунт переменную: Переменная действует на всех персонажей данного аккаунта. 2. Глобальные переменные: •К примеру мы хотим объявить о начале эвента. Эвент НПС может стоять всегда в пронтере, но пускать только в определенное время. Как же это сделать? С помощью глобальной переменной. Пример: В самом НПСе, в самом начале: Думаю все понятно. •Вот ещё пример использования глобальных переменных: к примеру нам нужно задавать случайное имя монстра. Делается это следующим образом: Пока всё. Это не гайд по переменным, т.к. тут описана лишь малая часть их. Но не всё сразу. Все вопросы по переменным задавайте здесь. Надеюсь вам понадобиться это описание. by nomn
  5. И так начнём, как вообще ввести своего или чужого нпц к себе на сервер? А делается это очень просто. 1) Для начала заходим в папку, где лежит ваш эмулятор. 2) Заходим в папку npc. 3) Создаём там папку к примеру mynpc 4) Создаём там текстовый документ(*.txt) 5) Называем его к примеру test и вписываем туда код скрипта 6) Заходим в папку npc 7) Открываем блокнотом файл script_custom.conf 8) Видем эти строчки: // ------------------------- My Scripts ------------------------- //npc: npc/location/to/script.txt 9) Стираем строчку //npc: npc/location/to/script.txt 10) И вместо неё пишем вот так: npc: npc/mynpc/test.txt 11) Сохраняем, перезагружаем сервер, если он запущен, радуемся! Спасибо за внимание. by Мяфк
  6. И так в первом уроке мы научились вводить нпц в игру. Теперь попробуем написать собственного нпц. Первая наша строка будет такова: prontera,150,150,4<%TAB%>script<%TAB%>Первый НПЦ<%TAB%>987,{ Чтоб было понятнее, разберём каждое слово. prontera - карта, где будет стоять наш нпц. 150,150 - координаты, X и Y. Их можно узнать, если введёте /where в игре. 4 - Куда наш нпц смотрит. от 1 до 8 сторон. <%TAB%> - это самая главная ошибка всех новичков. Между 4 и script мы нажимаем НЕ на пробел, а на кнопку TAB. script - обязательное слово. Первый НПЦ - Имя нашего НПЦ, которые будет высвечиваться, когда мы в игре наведём на него мышкой. 987 - номер спрайта, т.е. как выглядит наш НПЦ. Посмотреть список спрайтов можно тут { - Открываем функцию нпц. Небольшая заметка: Всё, что в НПЦ открывается { должно соответственно закрываться } Иначе мап-сервер будет писать ошибку. Так с первой строчкой разобрались. Теперь пишем диалог, сегодня мы научимся писать диалогового нпц. На следующей строчки пишем так: mes "[Учитель Мяфк]"; В первой строчке обычно пишут имя нпц. Оно не обязательно должно совпадать с тем именем, что в первой строчке и обычно в квадратных скобках. Немного о самой комманде mes: mes выдаёт строкув игру при разговоре с нпц. mes всегда должна начинаться с кавычки " и заканчиваться ей " и так же заканчиваться ; mes "message"; Вот так. Дальше пишем вторую и третью строку. mes "Ты понял, что такое диалог"; mes "Теперь я научу тебя кнопкам next и close"; Дальше пишем комманду next; next - Буквально переводится, как следующий. Переходит на следующий этап разговора с нпц, обычно используется, для красоты и когда у нпц огромный текст, мы стираем предыдущий и игроку показывается текст, который после next. В конце next обязательно ; Дальше пишем: mes "Вот ты и познакомился с командой next"; close; } Так, у тебя думаю возникли вопросы. Первая строка понятна, а вот вторая? close - буквально переводится закрыть, заканчивает разговор с нпц, в игре появляется кнопка close и при нажатие на ентер или на неё, закрывается диалоговое окно с нпц. } - как я говорил надо закрыть нпц. Спасибо за внимание. by Мяфк
  7. На Старом форуме была, сейчас незнаю, если Agasper создаст раздел , то тоже будет
  8. Элементарные скрипты, писать минуту от силы =\ - script announce_lvl -1,{ OnPCBaseLvUpEvent: if(BaseLevel == 10) goto level; level: announce "Игрок "+strcharinfo(0)+" взял 10 уровень!!! Теперь он Отец сервера!",8; end; } А на счет выбивания карт, помоему можно в Conf включить это.
  9. Плохо пробовал. P.s Почистил тему от флуда.
  10. Присоединюсь к Milky Way, так же могу во всех, с моей точки зрения адекватен, со стороны не замечал каких либо психических припадков , такая вот мини анкета , ждём вердикта Agasper'a
  11. Видимо он хотел написать mob_db.txt
  12. Если ты называешь Наоту !@#$%ым , тогда скажи мне ,чем ты лучше его?, на мой взгляд ты в разы хуже чем он ,даже слово трудно подобрать характеризующее тебя.
  13. Где mapflag noequip просто блокирует текущий эквип 99 - раздевает чара и блокирует эквип 1-10 снимает вещь из указанных слотов блокирует весь эквип (слоты считал сверху вниз, слева направо) Index: map/clif.c =================================================================== --- map/clif.c (revision 13936) +++ map/clif.c (working copy) @@ -8088,6 +8088,35 @@ clif_mercenary_skillblock(sd); } + if(map[sd->bl.m].flag.noequip) { + if( map[sd->bl.m].flag.noequip == 1 && sd->equip_index[EQI_HEAD_TOP] >= 0 ) + pc_unequipitem(sd,sd->equip_index[EQI_HEAD_TOP],1); + if( map[sd->bl.m].flag.noequip == 2 && sd->equip_index[EQI_HEAD_MID] >= 0 ) + pc_unequipitem(sd,sd->equip_index[EQI_HEAD_MID],1); + if( map[sd->bl.m].flag.noequip == 3 && sd->equip_index[EQI_HEAD_LOW] >= 0 ) + pc_unequipitem(sd,sd->equip_index[EQI_HEAD_LOW],1); + if( map[sd->bl.m].flag.noequip == 4 && sd->equip_index[EQI_ARMOR] >= 0 ) + pc_unequipitem(sd,sd->equip_index[EQI_ARMOR],1); + if( map[sd->bl.m].flag.noequip == 5 && sd->equip_index[EQI_HAND_R] >= 0 ) + pc_unequipitem(sd,sd->equip_index[EQI_HAND_R],1); + if( map[sd->bl.m].flag.noequip == 6 && sd->equip_index[EQI_HAND_L] >= 0 ) + pc_unequipitem(sd,sd->equip_index[EQI_HAND_L],1); + if( map[sd->bl.m].flag.noequip == 7 && sd->equip_index[EQI_GARMENT] >= 0 ) + pc_unequipitem(sd,sd->equip_index[EQI_GARMENT],1); + if( map[sd->bl.m].flag.noequip == 8 && sd->equip_index[EQI_SHOES] >= 0 ) + pc_unequipitem(sd,sd->equip_index[EQI_SHOES],1); + if( map[sd->bl.m].flag.noequip == 9 && sd->equip_index[EQI_ACC_R] >= 0 ) + pc_unequipitem(sd,sd->equip_index[EQI_ACC_R],1); + if( map[sd->bl.m].flag.noequip == 10 && sd->equip_index[EQI_ACC_L] >= 0 ) + pc_unequipitem(sd,sd->equip_index[EQI_ACC_L],1); + if( map[sd->bl.m].flag.noequip == 99 ) { + int i; + for(i=0;i<11;i++) + if(sd->equip_index[i] >= 0) + pc_unequipitem(sd,sd->equip_index[i],1); + } + } + if(sd->state.connect_new) { int lv; sd->state.connect_new = 0; @@ -8970,6 +8999,10 @@ clif_clearunit_area(&sd->bl,1); return; } + + if (map[sd->bl.m].flag.noequip) + return; + index = RFIFOW(fd,2)-2; if (index < 0 || index >= MAX_INVENTORY) return; //Out of bounds check. @@ -9014,6 +9047,9 @@ return; } + if (map[sd->bl.m].flag.noequip) + return; + if (sd->state.storage_flag) ; //You can equip/unequip stuff while storage is open. else if (pc_cant_act(sd)) Index: map/map.h =================================================================== --- map/map.h (revision 13936) +++ map/map.h (working copy) @@ -463,6 +463,7 @@ unsigned nochat :1; unsigned partylock :1; unsigned guildlock :1; + unsigned noequip :12; } flag; struct point save; struct npc_data *npc[MAX_NPC_PER_MAP]; Index: map/npc.c =================================================================== --- map/npc.c (revision 13936) +++ map/npc.c (working copy) @@ -2897,6 +2897,17 @@ map[m].flag.partylock=state; else if (!strcmpi(w3,"guildlock")) map[m].flag.guildlock=state; + else if (!strcmpi(w3,"noequip")) { + if( state ) + { + if( sscanf(w4, "%d", &state) == 1 ) + map[m].flag.noequip = state; + else + map[m].flag.noequip = 100; + } + else + map[m].flag.noequip = 0; + } else ShowError("npc_parse_mapflag: unrecognized mapflag '%s' (file '%s', line '%d').\n", w3, filepath, strline(buffer,start-buffer));
  14. Fox RM

    [atcommand] @aura

    @aura , by Zeph Diff на эту команду :
  15. Fox RM

    [Гайд] Custom Mobs

    Гайд по добавлению кастомных мобов в Renewal клиент с помощью Lua-файлов.
  16. Краткий гайд по добавлению кастомных локаций на ваш сервер. by nomn
  17. Fox RM

    Sacrifice

    Суть данного фикса:Sacrifice мисает по большому "Lucky Dodge" , делаем так , чтобы не "мисало". Заходим в src/map/battle.c Находим : if ( (!skill_num || skill_num == PA_SACRIFICE) && tstatus->flee2 && rnd()%1000 < tstatus->flee2 ) { //Check for Lucky Dodge wd.type=0x0b; wd.dmg_lv=ATK_LUCKY; if (wd.div_ < 0) wd.div_*=-1; return wd; } Эту строку if ( (!skill_num || skill_num == PA_SACRIFICE) && tstatus->flee2 && rnd()%1000 < tstatus->flee2 ) Меняем на эту: if ( (!skill_num) && tstatus->flee2 && rand()%1000 <
  18. Fox RM

    [atcommand] @droplock

    Команда @droplock Реализация: nomn Идея: неизвестно Суть: запрещает выкидывать вещи из инвентаря на пол. Защита от случайного выкидывания вещей. Ниже исходник:
  19. 1)Hatred Открываем eA/src/map/pc.c и ищем это: //Attempts to set a mob. int pc_set_hate_mob(struct map_session_data *sd, int pos, struct block_list *bl) { int class_; if (!sd || !bl || pos < 0 || pos > 2) return 0; if (sd->hate_mob[pos] != -1) { //Can't change hate targets. clif_hate_info(sd, pos, sd->hate_mob[pos], 0); //Display current return 0; } class_ = status_get_class(bl); if (!pcdb_checkid(class_)) { unsigned int max_hp = status_get_max_hp(bl); if ((pos == 1 && max_hp < 6000) || (pos == 2 && max_hp < 20000)) return 0; if (pos != status_get_size(bl)) return 0; //Wrong size } sd->hate_mob[pos] = class_; pc_setglobalreg(sd,hate_var[pos],class_+1); clif_hate_info(sd, pos, class_, 1); return 1; } Заменяем этот кусок на это: /Attempts to set a mob. int pc_set_hate_mob(struct map_session_data *sd, int pos, struct block_list *bl) { int class_; if (!sd || !bl || pos < 0 || pos > 2) return 0; sd->hate_mob[pos] = -1; class_ = status_get_class(bl); if (!pcdb_checkid(class_)) { unsigned int max_hp = status_get_max_hp(bl); if ((pos == 1 && max_hp < 6000) || (pos == 2 && max_hp < 20000)) return 0; if (pos != status_get_size(bl)) return 0; //Wrong size } sd->hate_mob[pos] = class_; pc_setglobalreg(sd,sg_info[pos].hate_var,class_+1); clif_hate_info(sd, pos, class_, 1); return 1; } 2)Feeling Открываем eA/src/map/skill.c и находим это: case SG_FEEL: //AuronX reported you CAN memorize the same map as all three. [Skotlex] if (sd) { if(!sd->feel_map[skilllv-1].index) clif_parse_ReqFeel(sd->fd,sd, skilllv); else clif_feel_info(sd, skilllv-1, 1); } break; Заменяем этот кусок на это: case SG_FEEL: //AuronX reported you CAN memorize the same map as all three. [Skotlex] if (sd) { clif_parse_ReqFeel(sd->fd,sd, skilllv); } break;
×
×
  • Создать...
Яндекс.Метрика