Jump to content

wl.illusion

Members
  • Posts

    13
  • Joined

  • Last visited

About wl.illusion

  • Birthday 06/14/1983

Profile Information

  • Gender
    Male
  • Location
    Leningrad, Russia

Contact Methods

Recent Profile Visitors

2455 profile views

wl.illusion's Achievements

Poring

Poring (1/15)

9

Reputation

  1. The battle.c function cell_pk_check have some bug, where is fixed and working version: bool cell_pk_check(struct block_list *t_bl, struct block_list *s_bl, int m) { if(t_bl->type == BL_PC && map[m].cell[s_bl->x+s_bl->y*map[m].xs].pk == true && map[m].cell[t_bl->x+t_bl->y*map[m].xs].pk == true) { int s_party = status_get_party_id(s_bl); int s_guild = status_get_guild_id(s_bl); if( s_party && s_party == status_get_party_id(t_bl) ) { if(map[m].flag.pvp_noparty) return true; else return false; } if( s_guild && s_guild == status_get_guild_id(t_bl) ) { if(map[m].flag.pvp_noguild && map[m].flag.gvg) return true; else return false; } return true; } return false; }
  2. Это со стандартного джобмастера не получается? set .ThirdClass,1; // Enable third classes? (1: yes / 0: no)Тут что-то непонятное написано?Или не удалить загрузку прогружающихся нпц для 3'их профессий? re/scripts_jobs.conf // - 3-1 npc: npc/re/jobs/3-1/archbishop.txt npc: npc/re/jobs/3-1/mechanic.txt npc: npc/re/jobs/3-1/ranger.txt npc: npc/re/jobs/3-1/rune_knight.txt npc: npc/re/jobs/3-1/warlock.txt npc: npc/re/jobs/3-1/guillotine_cross.txt // - 3-2 npc: npc/re/jobs/3-2/genetic.txt npc: npc/re/jobs/3-2/minstrel.txt npc: npc/re/jobs/3-2/royal_guard.txt npc: npc/re/jobs/3-2/shadow_chaser.txt npc: npc/re/jobs/3-2/sorcerer.txt npc: npc/re/jobs/3-2/sura.txt npc: npc/re/jobs/3-2/wanderer.txtВы уже настолько обленились, что даже сами поискать ничего не можете, даже включить мозг создаётся впечатление, что у вас его просто нет.
  3. Если я правильно помню, то подпись предмета — это хранение ID-чара в базе, можно впринципе и без модификаций сорцов сделать, только тогда потом как-то надо за раздувшейся базой чаров следить.Алгоритм такой: - НПЦ получает от игрока подпись через INPUT (желательно ограничить её по размеру до 23 символов) - СКРИПТ вносит эту подпись в базу MySQL, как имя персонажа - Делает подпись на предмете с этим ID опционально: - поправить сорцы на предмет удаления предмета, делать проверку id подписи и удалять ещё чар-подпись из базы, чтобы не захламлять базу или написать скрипт на крон для проверки «устаревших» предметов. Если этого не сделать, база будет засрана чарами-подписями. Не жадный, даю рабочий скрипт: prontera,155,231,3 script TestSql#sql 792,{ set .@account_id, 199; mes "Введите подпись, максимум 23 символа."; next; input(.@write$, 0, 23); mes "Точно хотите подписать: ^3355FF"+.@write$+"^000000"; if ( select("Я передумал:Всё отлично") == 1 ) { close; } query_sql("INSERT INTO `char` (`account_id`, `zeny`) VALUES ("+.@account_id+", "+getcharid(0)+")"); query_sql("SELECT char_id AS id FROM `char` WHERE `account_id` = "+.@account_id+" AND `zeny` = "+getcharid(0)+" ORDER BY `char_id` DESC LIMIT 1", .@id); query_sql("UPDATE `char` SET `name` = '"+escape_sql(.@write$)+"', `zeny` = 0 WHERE char_id = "+.@id); getitem2 501,1,1,4,0,254,0,.@id&0xffff,(.@id>>16)&0xffff; close; } Выглядить будет вот так: Вариантов с сорц модификацией можно придумать достаточно много, но это будет сорц модификация.
  4. Тут явная ошибка DB, пакетверсия скорее всего ни при чём.
  5. Я их уже выложил в другом месте, как и многие мелкие доработки, возможно и здесь продублирую в будущем.
  6. wl.illusion

    Простите, если обидел вас, я уже говорил, что ничего личного — простой ликбез, так что, если задел, приношу извинения. Ваши контакты я записал, но сейчас со временем могут быть сложности, мои контакты есть в профиле, в скайпе я всегда в «красном» статусе, но это ничего не значит — я вполне могу быть онлайн.
  7. wl.illusion

    Вы не правы, после указания SET NAMES default кодировка базы данных уже не имеет значения. Посути, вы просто говорите серверу: «Давай общаться на cp1251» и сервер начинает с вами общаться в этой кодировке. Впрочем, я тоже немного неправ был, утверждение о SET NAMES и collation не для всех сочетаний верно. Не знаю как корректно объяснить, но по сути, поймите, если у вас правильно выставлен collation и вы отправляете запрос с кодировкой указанной в set names, то MySQL всё воспримет правильно. SET NAMES - это просто язык транспорта. Буквально, пример, у вас collation UTF8_bin (я её чаще всего использую), но ваш клиент работает с cp1251, вы говорите сервер mysql SET NAMES cp1251 («Давай общаться на cp1251»), сервер это понимает и начинает «на лету» вам всё конвертировать. Вы даёте ему запрос в cp1251 и он при получении его конвертирует у себя в UTF8_bin, и наоборот, высылает вам запрос в cp1251, чтобы ваш клиент мог с ним корректно работать. Никаких кракозябр, никаких вопросов и прочего. Для РО вы указываете cp1251, потому что сам клиент РО понимает только эту кодировку для русских символов, поэтому и надо делать SET NAMES cp1251, но это не означает, что база данных должна быть с collation cp1251, она вполне может быть с UTF8, что предпочтительней. И вы уж как nix админ это должны знать. Да, именно штудировать каждый пункт один раз в жизни, учитывая, что там всё написано доступным языком и этих пунктов в conf не наберётся даже с полусотни, а те, которые важны и вообще с десяток. Это избавит вас от неловкой ситуации, когда вы что-то делаете, а это уже есть, учитывая, что вы даже использовали не ту команду Си (ничего страшного нет, но есть решение предусмотренное разработчиками MySQL и правильнее его использовать). Один раз в жизни прочитать мануал, а не делать глупости — настроил и забыл, а вы ещё исходники копали, придумывали решение. Заняло бы это одинаковое кол-во времени, может ещё чего полезного нашли бы. Я программист C/C++, PHP, Python, системное администрирование nix серверов. В мои задачи входит разработка биллинг системы (работа с большим числом клиентов), сопровождение САПР, настройка веб и прочего связанного с этим, кроме того я фрилансю в доработке чужих проектов (исправление чужих косяков, доработка проекта «до ума», внедрение новых решений в чужие проекты). Что меняется? Я говорю вам, что вы не правы и указываю точно, где именно не правы, и меня удивляет с какой лёгкостью вы хвастаетесь, что вы системный администратор каких-то бизнес-решений, но при этом не понимаете элементарных вещей, более того, пытаетесь убедить в том, что создание «костыля» в месте, где решение уже предусмотрено разработчиками — обосновано. А ваша проблема была в том, что вы неосилили всего несколько conf файлов, что для любого уважающего себя системного администратора — просто неприемлимо. Вот за такими «пофигу как, но успеть в срок» — мне потом косяки и приходится тоннами выгребать А спросить есть где, тут русское сообщество полумёртвое, никто не спорит, но англоязычное вполне себя хорошо чувствует и написать пару слов на ломаном английском я думаю вы смогли бы. Подобное решение вашему я писал в 2008 году, когда не было ещё default_codepage в настройках (увы), но в 2010 я был очень приятно удивлён, когда полез снова ставить для себя и друзей сервер, а в настройках обнаружил этот пункт. И поймите, у меня нет ничего личного к вам, я просто развожу ликбез, чтобы вы и другие читатели понимали основы, раз уж полезли в сорцы.
  8. wl.illusion

    Вы написали именно то, что я описал, ваша доработка - не нужна, она _уже_ присутствует. Ваше неспособность прочитать описание настроек .conf привела именно к той проблеме, что вы сделали, то что уже есть. И SET NAMES это то, что я описал. Если вы по каким-то причинам не понимаете, что вы делаете, где именно у вас проблема и прочее — не повод путать людей. Похвально, что вы интересуетесь Си, очень прискорбно, что вы его не понимаете, и ещё более прискорбно, что вы не читаете описание .conf сервера. А чтобы у нас с вами не было больше споров, то даю вам прямую наводку в src: Открываете файл src/common/sql.c Интересующая нас функция: int Sql_SetEncoding(Sql* self, const char* encoding) Там внутри есть вызов функции mysql_set_character_set — гуглим и находим описание на сайте dev.mysql.com. Читаем описание, оно на английском но достаточно понятное, могу даже выделить то, что вас интересовать должно: Рекомендую, прежде, чем писать сорс-мод изучить внимательнее настройки Афины, чтобы не проделывать лишнюю работу и тем более, что-то выкладывать на форум, а то можно запутать новичков. p.s. повторюсь относительно запроса SET NAMES: Это запрос, который говорит серверу MySQL о том в какой кодировке «клиент» будет высылать данные серверу MySQL и в какой кодировке хочет эти данные получать. Сама база MySQL может быть в любой доступной кодировке (collation).
  9. wl.illusion

    Вы изобретаете велосипед, данная настройка есть в conf файлах уже достаточно давно. В файле: conf/inter_athena.conf // You can specify the codepage to use in your mySQL tables here. // (Note that this feature requires MySQL 4.1+) //default_codepage: Снимаете закомментированость строки, чтобы получилось: default_codepage: cp1251 Разумеется, неплохо ещё и саму базу в MySQL создавать с utf8 или cp1251 (utf-8 предпочтительней). ps и SET NAMES это не то, что вы объяснили, SET NAMES объясняет базе MySQL в какой кодировке вы хотите с ней общаться, а не работать, работать она будет с указанной в collation. И не важно в чём у вас база, даже с utf-8 можно указывать SET NAMES cp1251, ещё раз говорю — данный запрос говорит серверу MySQL в какой кодировке работает ваш «клиент», а для себя он уже сам конвертирует в кодировку collation.
  10. Доброго времени суток, Господа! Может кто помнит меня по ныне умершему форуму, но кто не помнит — я любитель «иногда» заниматься афиной, иногда — это каждый конец года меня тянет сесть и что-то написать. Поскольку форум ea уже давно корячило в агонии, то старых моих тем там не осталось (как так можно к бэкапам относиться то?), ну, а у меня накопилось некоторое кол-во скриптов, которыми не жалко поделиться. Что есть и работает, собственно, и сами вопросы: — тема с Tombstone и здесь живая, хотя уже архивная, я не могу отредактировать её и выложить более новую версию под re - нужно создавать новую тему? Скрипт написан год назад. — Есть скрипт-API для создания честных варщиков и крафтеров - скрипт полностью эмулирует шанс крафта и варки, есть два NPC - алхимик (полностью готов, с квестами) и кузнец (есть несколько квестов, работает, но не хватает нескольких последних квестов). Скрипты написаны год назад. — Более сложный варпер - можно создавать сложное схемное перемещение, настраивать для каждого перемещения различные цены (кафра купоны, зени, если не заброшу - предметы). Скрипт новый. — Переработанные под свои нужды Jobmaster (настройка съёма оплаты кафра купонами для смены профессий) и написанный Resetnpc (сбрасывает только статы), healer с квестом - баланс оплаты немного хромает. — Универсальный скрипт для создания квестов на сбор лута. Создавался пару лет назад. — Сейчас делаю Торговую Гильдию Кафра - скрипт сделан для создания новой экономической системы, как было заметно в прошлых скриптах, используются для оплаты кафра купоны. Есть NPC, которые дают выполнять квесты, с ними можно общаться, есть рейтинг, который меняется в зависимости от выполненных квестов, по-сути аналог Eden только без плюшек в виде особенного шмота Вот и до вопросов к модераторам добрался, добром могу поделиться, сделать более ли менее понятное описание (как, например, в Tombstone), в старых скриптах я кое-что уже подзабыл, но думаю описание всё равно смогу сделать. Можно и нужно ли такое выкладывать, или всем пофиг и стоит забить на альтруизм?
  11. [script][npc] Advanced Tombstone v1.03 Зачастую игроки хотят знать, когда воскреснет MVP, да и кто такой супер-крутой его смог забить, а многим админам хотелось бы иметь удобный инструмент для работы с MVP (отключить не залезая в конфиги, убить, чтобы игроки могли спокойно бегать по локации или оживить убитого MVP для соискателей приключений). Описание Скрипт позволяет управлять MVP (и не только, при желание), получать информацию о состояние MVP. Скачать Скрипт версии 1.03: скачать (в базе монстров все mvp от 13.2, Maya Purple и один тестовый квестовый моб) (Используя скрипт вы обязуетесь следовать лицензионному соглашению указанному в скрипте) Вот список возможностей: После смерти Монстра создаётся Tombstone с информацией о монстре, кто его убил и времени его воскрешения; Имеется несколько режимов состояние монстра (Живой, мёртвый и ждёт воскрешения, отлючен); Запоминание режима даже после перезагрузки (координаты Tombstone так же запоминаются); При отключение выставляется в стандартно установленное место (Координаты прописываются в таблицу скрипта); Координаты respawn'а выставляются как и в map monster (а не как в areamonster, кому интересна разница читайте doc'и); Время respawn'а указывается как в map monster (а не как в оригинальном Tombstone); Можно указывать имя моба, а не брать стандартное из mobdb; Специальный NPC с помощью которого GM'ы могут управлять режимом монстров (Убить монстра, оживить немедленно, отключить) и получить некоторые сведения о состояние монстра; После смерти монстра создаётся NPC Tombstone с окном чата сообщающим когда монстр оживёт, что он отключен или был убит и квест завершён; При разговоре с NPC Tombstone сообщается имя убившего (отключившего) его персонажа, для GM'ов есть функция мгновенного оживления монстра; Создание монстра можно вызывать из любого скрипта (методом вызова глобальной функции), что позволяет делать квесты. Недостатки и ошибки Я могу назвать только одну ошибку — при использование GM команды @killmonster скрипт работает некорректно. Так же не работает зеркало (будет говорить, что MVP на карте необнаружены, imho, не критично, т.к. Tombstone показывает нужную информацию и без того). Если что-то найдёте — отписывайтесь. Скриншоты Примечание Базы монстров скрипта настроены на обычный сервер, не Renewal, если вам нужно для Renewal, то боюсь придётся немного потрудиться базы сильно отличаются. Вы так же должны очистить(закомментировать) все записи о расположение текущих монстров в скриптах NPC. Для доступа к MVP Master и функции оживления монстра из Tomb'а нужен GM уровень не ниже 50ого, иначе NPC вас будут просто троллить Таблица монстров скрипта Массивы данных: setarray .mvpbmid[0],0; // Mob ID setarray .mvpbdl1[0],0; // Respawn Delay1 (in seconds, if is 0 - then mob consider as Quest Mob and not creating on first OnInit) setarray .mvpbdl2[0],0; // Respawn Delay2 (in seconds, if is 0 - then not create Tomb and Chat Room) // Default Tombstone coordinates X,Y setarray .mvpbcdx[0],0; setarray .mvpbcdy[0],0; // Area coordinates to spawn X,Y,X1,Y1 (if X and Y = 0 - get random area) setarray .mvpbcx[0],0; setarray .mvpbcy[0],0; setarray .mvpbcx1[0],0; setarray .mvpbcy1[0],0; setarray .mvpbaname$[0],""; // Name for Admins NPC (if empty then get from MobDB) setarray .mvpbmname$[0],""; // Mob name setarray .mvpbevent$[0],""; // Do Event on Kill Monster (empty to nothing todo) mvpbmid — MobID (идентификатор монстра) соответствующий идентификатору в базе - mob_db.txt mvpbdl1 — Время респауна (указывается в секундах!), через какое минимальное кол-во времени монстр воскреснит, если значение установлено равное 0, то монстр считается квестовым и после своей смерти он не пересоздаётся, чат комната так же имеет иное содержание, а не время до следующего респауна mvpbdl2 — Разница во времени респауна (в большую сторону, указывается в секундах), если значение установлено равное 0, то после смерти монстра не создаётся его Tombstone mvpbcdx, mvpbcdy — Расположение по-умолчанию Tombstone (X, Y), это место, где будет установлен Tombstone при убийстве или отключение монстра через Admin NPC mvpbcx, mvpbcy, mvpbcx1, mvpbcy1 — X, Y - коордианты появления монстра (если координаты равны 0, то коордианты берутся случайным образом относительно всей локации), X1, Y1 - разброс в появление монстра (X, Y при этом являются центром зоны появления, а X1, Y1 - диаметром) mvpbaname$ — Название монстра для меню Admin NPC, если оставить пустым, то возьмётся имя из базы mvpbmname$ — Название монстра, можно указывать какое имя из базы брать ("--ja--" - корейское название, "--en--" - английское название, или указывать своё название) mvpbevent$ — Обработка Event после смерти моба, чаще всего необходима для создания квестов (смотрите пример в скрипте с Yggas'Worth) Пример для монстра Fallen Bishop: callsub(L_AddMobDB,1871,7200,600,238,73,236,78,21,18,"","--en--",""); Добавление монстра Добавление монстра проходит в две стадии — первая стадия включает в себя дубликата NPC на нужную локацию с определённым именем, вторая — прописывание данных в таблицу монстров скрипта. Итак, для начала добавляем дубликат NPC, тут ничего сложного, находим последнюю запись дубликатов, допустим, у нас всего два монстра и последняя запись, пусть будет примерно такая: prontera,0,0,0 duplicate(tombstone_dup) Tomb#2_mvp 565 Запоминаем, что название NPC — Tomb#2_mvp, сейчас нам очень важна скрытая часть названия «2_mvp» — здесь важная цифра, это «2», значит в таблице всего 2 монстра, добавляем нашего нового монстра, пусть это будет Beelzebub (#1873), заглядываем в npc/mobs/dungeons/abbey.txt и находим нашего монстра: abbey03,0,0,0,0 boss_monster Beelzebub 1873,1,43200000,600000,1 Комментируем эту строчку и добавляем после последнего найденного нами дубликата NPC в скрипте строчку, указывая в скрытом название NPC следующий номер (2_mvp был последним, значит теперь будет 3_mvp): abbey03,0,0,0 duplicate(tombstone_dup) Tomb#3_mvp 565 Отлично, теперь нам надо добавить информацию о монстре, добавляем в таблицу монстров скрипта строчку: callsub(L_AddMobDB,1873,43200,600,120,112,0,0,0,0,"","--en--",""); Монстр добавлен и при перезагрузке появится на указанной локации. Немного о глобальной функции Для взаимодействия самого скрипта монстров с внешними NPC было созданное небольшое API (не слишком хорошо написанное, но рабочее). Это функция tmvp_menu, она имеет входящие ключи для определения того, что именно вам нужно (getarg(0)), вот id ключей и их краткое описание: 0 - Вызывается при основном OnInit скрипта монстров, создаёт нужные переменные и устанавливает первый пункт для Admin NPC - «Nothing» 1 - Вызывается при OnInit скрипта монстров, запоминает нужные данные для последующей работы 2 - Возвращает созданное меню (список монстров со статусом, работает медленно, т.к. обращается к глобальным данным) 3 - Устанавливает режим монстра в «Суицид», входящим данным (getarg(1)) является номер пункта меню, возвращает 0 — если всё прошло успешно, 1 — монстр не может быть установлен в режим (режим уже установлен или монстр отключен) 4 - Устанавливает режим монстра в «Оживить», возвращает 0 — если монстр создан успешно, 1 — монстр уже создан и не может быть создан снова, входящим данным является номер монстра (mvpbid) в таблице монстров скрипта 5 - Возвращается текст из пункта меню (Обычно это имя монстра), входящим данным является номер пункта меню 6 - Устанавливает режим монстра в «Суицид», входящим данными является mvpbid и имя персонажа, которое будет установлено как имя убийцы монстра, возвращаемые данные такие же, как и для 3 7 - Возвращает состояние монстра (Текстовое сообщение), входящим данным является mvpbid 8 - Возвращается mvpbid, входящим данным является номер пункта меню 9 - Устанавливает режим монстра в «Убить и отключить», входяшими данными является mvpbid и имя персонажа, возвращает 0 — при успешном выполнение, 1 — если монстр уже отключён. Формат вызова функции: callfunc("tmvp_menu", <номер ключа>(, <входящие переменные>)); Входящие переменные: mvpbid — это ID монстра в таблице скрипта, это не одно и то же, что и MobID. номер пункта меню — это уникальный идентификатор пункта меню для Admin NPC, который создаётся в 0 и 1 ключах функции, вызывается такое меню ключом 2 charname — имя персонажа игрока Пример, убить монстра №2: callfunc("tmvp_menu", 6, 2, strcharinfo(0)); Пример, воскресить монстра №2: callfunc("tmvp_menu", 4, 2); Для наглядности в скрипт добавлен NPC Yggas'Worth, он создаёт Поринга с кастумным названием и ждёт пока вы его не убьёте. На самом деле это самый простой пример, но вы можете добавлять каких-либо сложных монстров и создавать на этой основе квесты. Немного о глобальных переменных Их несколько, но вы можете использовать их в своих скриптах для создания квестов: $tmvp<mvpbid>_state — Признак состояния монстра (см ниже) $tmvp<mvpbid>_nick$ — Имя персонажа убившего монстра (учтите, что при измененеие состояния эта переменная не очищается) $tmvp<mvpbid>_x и $tmvp<mvpbid>_y — Координаты где расположен Tombstone (учтите, что при измененеие состояния эта переменная не очищается) $tmvp<mvpbid>_time — Время (указан tick с момента начала эпохи) до начала действия признака события (используется только для подсчёта времени respawn'а монстра) $tmvp<mvpbid>_created — Создан ли монстр (необходимо для некоторых проверок) (0 - нет, не создан, 1 - создан и бегает) $tmvp<mvpbid>_frun — Первый или нет запуск (0 - первый запуск, 1 - запуск уже был), необходимо для квестовых мобов, чтобы они не создавались Признаки состояния монстров: 0 — Монстр жив и где-то бегает 1 — Признак на суицид 2 — Монстр убит и ожидает времени respawn'а 3 — Признак на немедленное оживление 4 — Признак на суицид и отключение 5 — Монстр отключён и ждёт включения 6 — Для квестового монстра, состояние его смерти (убит и ожидает оживления через квест) Вы можете использовать эти данные для написания скриптов квестов (смотрите пример в скрипте на Yggas'Worth). Механика Скрипт работает на режимах, это так называемые признаки событий, действия происходят не мгновенно, а только создают признак этого события. К примеру, вы выставляете монстру признак события на суицид, обработка этого события произойдёт в течени 5 секунд, когда внутренний обработчки скрипта распознает этот признак и примет решение о том, что нужно сделать. Итерация обработчика - 5 секунд (OnTimer5000), вы можете поменять это значение на другое, но на свой страх и риск, учтите, что чем меньше вы делаете время обработки, тем больше нагрузок создаётся на ваш сервер (я считаю идеальным обработку каждые 10 секунд, но выставил 5, чтобы задержка составляла минимальную серверную). Благодарности Своей девушке, что разрешала работать над скриптом по ночам Sanasol — автору основного скрипта, я взял кусочек его кода (функция вывода времени, копирайт указан в скрипте, прошу прощения, было лень писать точно такую же функцию). Heler'у — за то, что оказывал некоторую помощь. nndsl — за подкинутую идею.
×
×
  • Create New...