Город Мастеров
IPB

Здравствуйте, гость ( Вход | Регистрация )

 Правила этого форума ПРАВИЛА РАЗДЕЛА
 
Ответить в эту темуОткрыть новую тему
> Ликбез по CNR, Изучаем систему крафта...
Аваддон
сообщение Oct 14 2004, 17:03
Сообщение #1


Level 10
***

Класс: Воин
Характер: Lawful Neutral
Раса: Человек
NWN: Скриптинг [PW]



На что способна эта система крафта – одному автору известно. И потому было решено начать ликбез по CNR. А начать я бы его хотел с ответа на вопрос Balrog’а – Как написать свой рецепт?! Мало того, мы еще затронем то – как написать рецепт при этом внеся новый типа материала для крафтинга и дележку крафтовых вещей по типу.

А все начиналось с тулсета и модуля CNR…
Задача урока – Создать раздел спец оружия. Создать подраздел клинков. Написать рецепт на клинок.

Открываем модуль CNR в тулсете. Так… Ищем скрипт наковальни. Он называется «cnrAnvilPublic». А вот теперь уже начинаем творить! Создадим новый раздел в наковальне – «Специальное оружие». Для этого найдем строчки:
Neverwinter Script Source
void ProcessMenuWeaponsCopp(string sMenuWeaponsCopp);
void ProcessMenuWeaponsBron(string sMenuWeaponsBron);
void ProcessMenuWeaponsIron(string sMenuWeaponsIron);

Добавим ниже строку:
Neverwinter Script Source
void ProcessMenuWeaponsSpec(string sMenuWeaponsSpec);

Ниже идут строки:
Neverwinter Script Source
string sMenuWeaponsCopp = CnrRecipeAddSubMenu("cnrAnvilPublic", "Медное Оружие");
  string sMenuWeaponsBron = CnrRecipeAddSubMenu("cnrAnvilPublic", "Бронзовое Оружие");
  string sMenuWeaponsIron = CnrRecipeAddSubMenu("cnrAnvilPublic", "Железное Оружие");

Добавим сюда наш пункт:
Neverwinter Script Source
string sMenuWeaponsSpec = CnrRecipeAddSubMenu("cnrAnvilPublic", "Специальное Оружие");

Прокручиваем скрипт ниже… Эта команда подсчитывает рецепты. Смотрим:
Neverwinter Script Source
CnrIncrementStackCount(OBJECT_SELF);
  AssignCommand(OBJECT_SELF, ProcessMenuWeaponsCopp(sMenuWeaponsCopp));

  CnrIncrementStackCount(OBJECT_SELF);
  AssignCommand(OBJECT_SELF, ProcessMenuWeaponsBron(sMenuWeaponsBron));

  CnrIncrementStackCount(OBJECT_SELF);
  AssignCommand(OBJECT_SELF, ProcessMenuWeaponsIron(sMenuWeaponsIron));

Добавляем:
Neverwinter Script Source
CnrIncrementStackCount(OBJECT_SELF);
  AssignCommand(OBJECT_SELF, ProcessMenuWeaponsSpec(sMenuWeaponsSpec));


Так дальше идет уже дележка на типы и рецепты. Крутим в самый низ, там где заканчивается строчками:
Neverwinter Script Source
CnrDecrementStackCount(OBJECT_SELF);
}


И начинаем монстрячить свой раздел:
Neverwinter Script Source
void ProcessMenuWeaponsSpec(string sMenuWeaponsSpec) //добавим раздел «Специальное оружие» в диалог наковальни. Результат показан на рис.1
{
  string sKeyToRecipe;
  string sMenuSpecBladed = CnrRecipeAddSubMenu(sMenuWeaponsSpec, "Клинки"); //добавим под-раздел Специальное оружие > Клинки. Результат показан на рис.2

//пишем рецепт
sKeyToRecipe = CnrRecipeCreateRecipe(sMenuSpecBladed, "Меч Лорда Аваддона", "spec_avaddon_sword", 1); //Начала рецепта. Выбираем в каком под-разделе будет данный предмет. Далее – Название. Потом Тэг предмета. И количество. Результат показан на рис.3
  CnrRecipeAddComponent(sKeyToRecipe, "cnrIngotIron", 3); // первый ингрдиент. , "cnrIngotIron" – тэг железных слитков, 3-необходимое количество.
  CnrRecipeAddComponent(sKeyToRecipe, "cnrMoldLarge", 1); //второй ингрдиент-тэг Большой литейной формочки. Ингридиентов может быть много Результат показан на рис.4
  CnrRecipeSetRecipeLevel(sKeyToRecipe, 4); //Средний уровень игрока в ремесле.
  CnrRecipeSetRecipeXP(sKeyToRecipe, 84, 84); //При удачном крафте опыта дадут  84 – игрового, и 84 ремесленного. Результат показан на рис.5
  CnrRecipeSetRecipeBiproduct(sKeyToRecipe, "spec_avaddon_fool", 0, 1);//Вторичный продукт при крафте.(например метал. стружка) "spec_avaddon_fool"- Тэг вторичного продукта, 0 - количество при удачном крафте, 1 – количество при неудачном крафте.
  CnrRecipeSetRecipeAbilityPercentages(sKeyToRecipe, 70, 30, 0, 0, 0, 0); //характеристики персонажа влиЯющие на процент удачного крафта. Сила, Ловкость, Телосложение,Интеллект, Мудрость, Харизма.

  CnrDecrementStackCount(OBJECT_SELF);//подводим итог количеству рецептов и заканчиваем функцию.
}


Ну и кончено, с шансом 65% у меня сделать свой меч получилось ;) Результат показан на рис.6 и 7.

Картинка результатов:
(IMG:http://saigh.nm.ru/text/images/CNR1.jpg)

Если не видно - жми сюда

Думаю все должно быть понятно. Удачи вам!:) Спрашивайте если что.

Сообщение отредактировал Аваддон - Nov 15 2004, 20:13
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
...::John Stark:...
сообщение Oct 14 2004, 17:38
Сообщение #2


Level 3
*

Класс: Обыватель
Характер: Lawful Good
Раса: Человек



Молодец Аваддон, мы все очень рады, что работаем вместе с тобой, и друг другом. :good:
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
balrog
сообщение Oct 14 2004, 20:18
Сообщение #3


Великий хранитель фотоальбома
Иконки Групп

Класс: Оборотень
Характер: Chaotic Neutral
Раса: Тварь
МАСТЕР Кисти



:D :D Джон сказал "все ооооооочень рады" ... да и многие увидев твой ликбез обрадуются :yes: :good:
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Аваддон
сообщение Nov 14 2004, 23:13
Сообщение #4


Level 10
***

Класс: Воин
Характер: Lawful Neutral
Раса: Человек
NWN: Скриптинг [PW]



Итак, для начала в дебри лезть не буду. Возьму первое главное - это конфиг.
Открываем скрипт cnr_config_ing.
Там можно найти много разных приблуд по настройке CNR. :swoon: :D
Что я изменил чтобы уменьшить лаги:
1. Этот пункт влияет на инициализацию рецептов. Если TRUE то CNR инициализирует все рецепты при первой загрузке модуля, естественно мод грузится будет долго. Если FALSE то будет инициализировать определенную часть рецептов при первичном использовании крафт инструмента. Если у вас шард, то лучше ставить TRUE. По крайней мере во время игры лагов у игроков не будет.
Neverwinter Script Source
int CNR_BOOL_INIT_RECIPES_ON_MODULE_LOAD = TRUE;


2. По слухам CNR еще лагает когда игроки смотрят список 10 лучших мастеров. Отключаем его. То есть прячем список.
Neverwinter Script Source
int CNR_BOOL_HIDE_TRADE_JOURNALS_TOP_TEN_LISTS = TRUE;


3. Если вы не хотите чтобы CNR показывал какие компоненты нужны игроку чтобы что-либо скрафтить, ставите TRUE. Но при этом увеличивается нагрузка на отсев рецептов , следовательно лаги. Ставим FALSE.
Neverwinter Script Source
int CNR_BOOL_HIDE_UNSATISFIED_RECIPES_IN_CRAFTING_CONVOS = FALSE;


4. Появляется нагрузка на отсев рецептов аналогично п.3. А сама функция если TRUE - прячет рецепты до которых игрок еще не дорос. Ставлю FALSE.
Neverwinter Script Source
int CNR_BOOL_HIDE_IMPOSSIBLE_RECIPES_IN_CRAFTING_CONVOS = FALSE;


Вроде бы пока что все. Признаюсь, лаги немножко уменьшились. Гы.
Жду ваших советов. Может еще поможете как его на MySQL перевести? А то я в этом не варю не фига. :drag:
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Аваддон
сообщение Nov 15 2004, 01:13
Сообщение #5


Level 10
***

Класс: Воин
Характер: Lawful Neutral
Раса: Человек
NWN: Скриптинг [PW]



Продолжу свою тему :dirol: Я думаю если так дальше пойдет можно будет книжки издавать хе хе...

ВНИМАНИЕ! Данный урок не представляет из себя пособия по NWNX2 итп. Он так же не расчитан на опытных мастеров. Урок предназначен для людей впервые столкнувшихся с MySQL+NWNX2 (таких как я). Здесь я делюсь опытом (грабли собираю сам :yes: ) полученным мною в процессе своей работы с CNR 3.05, дабы людям было проще разобраться. :this:

Ликбез по CNR - УРОК №3: :buba:

Тема сегодняшнего урока:
- Как перевести CNR 3.05 с DataBase Bioware на MySQL?

Цели сегодняшнего урока:
- Получить первичные навыки работы с MySQL
- Получить первичные навыки работы с APS/NWNX 2
- Уменьшить количество лагов в CNR за счет перведения оного на MySQL

Необходимый софт:
- MySQL
- MyODBC: Драйвер odbc для MySQL
- APS/NWNX 2
- PHP My Admin или SQLyog

Примечание: Сразу скажу - данное действо происходило на OS: Windows XP (Professional Edition) и в качестве софта был установлен пакет Apache+PHP+MySQL.

Часть 1 - МуСКУЛ

QUOTE
MySQL – сервер баз данных. MySQL характеризуется большой скоростью, устойчивостью и легкостью в использовании, является идеальным решением для малых и средних приложений.


Если у вас есть MySQL это хорошо. Если его нет - отправляйтесь по ссылке и качайте. У меня уже был MySQL версии 4.0.16-nt, поэтому я данной процедуре время не уделял.
Установка тоже довольно таки простая - это сделать будет легко и без моей помощи.
А вот теперь начинается самое интересное. После того как мы установили MySQL нам надо настроить его связь с ODBC.

QUOTE
Аббревиатура ODBC является сокращением для Open DataBase Connectivity, что можно перевести как „открытый интерфейс доступа к базам данных“. Этот интерфейс представляет собой набор функций, которые можно использовать для доступа к любой реляционной СУБД, поддерживающей SQL. На уровне операционной системы ODBC реализуется в виде группы DLL-библиотек, состоящей из драйверов отдельных баз данных (ODBC-драйверов) и так называемого менеджера драйверов, выполняющего роль прослойки между приложением-клиентом и ODBC-драйвером; именно наличие такой прослойки и обеспечивает независимость приложения от конкретного сервера БД.


Сейчас нам надо бы зайти в Панель Управления -> Администрирование -> Источники Данных (ODBC) -> Системный DSN -> Добавить... , НО (!) там нет типа базы данных MySQL есть только SQL сервер, а это нам не подходит. Да еще к тому же MySQL пишет : My ODBC Driver Not Found....

В таком случае еще раз отправляемся по ссылке и скачаиваем MyODBC: Драйвер odbc для MySQL.
Распаковывайте скачанный архивчик и запускайте setup. Устанавливается легко и безболезненно.
В итоге у нас появится драйвер MySQL в Системном DSN.
Так, все установили? Опять идем в Панель Управления -> Администрирование -> Источники Данных (ODBC) -> Системный DSN -> Добавить...
Вуаля! У нас появился драйвер MySQL
(IMG:http://saigh.fatal.ru/text/images/cnr_3_2.gif)

Выбираем этот драйвер и появляется окно настроек:

(IMG:http://saigh.fatal.ru/text/images/cnr_3_3.gif)

Потом нажимаем ОК и получаем:
CODE

Системные источники данных:
Имя   |  Драйвер
nwn   |  MySQL

Жмем везде OK и закрываем окна.

Часть 2я - APS/NWNX 2 и Создаем базу данных "nwn" в MySQL при помощи PHP My Admin

Скачиваем APS/NWNX 2 по ссылке на nwvailt'е. Распаковываем архив.
Файлы: NWNX2.exe, madCodeHookLib.dll, nwnx-module.dll, nwnx_odbc.dll(находится в папке "modules") копируем в директорию с NWN'ом (это там где у нас находится nwmain.exe и nwserver.exe).

Все, на это с APS/NWNX 2 пока что закончили - мы это "установили".

Устанавливаем Php My Admin и создаем с помощью него базу данных nwn. Действия должны быть такими:

(IMG:http://saigh.fatal.ru/text/images/cnr_3_4.gif)

Часть 3я - "Заставляем модуль работать с тем, что мы сотворили" или "Не все скрипты одинаково полезны"

Откроем модуль CNR 3.05 RUS в редакторе Aurora Toolset. Сейчас предстоят глобальные изменения:

Шаг 1.
В скрипте cnr_config_inc меняем переменную CNR_BOOL_RECIPE_DATA_IS_PERSISTENT_IN_SQL_DATABASE с FALSE на TRUE
Neverwinter Script Source
// If you're a power builder/DM that uses APS/NWNX2 and would like to tweak recipes and
// reload them without restarting the mod, then you can set this flag to TRUE. CNR will
// create four related tables to hold the recipe data.
int CNR_BOOL_RECIPE_DATA_IS_PERSISTENT_IN_SQL_DATABASE = TRUE;


Шаг 2.
Откройте скрипт cnr_persist_inc и ЗАкоментируйте строчки для Bioware DataBase и РАСкоментируйте строчки для APS.
ПРИМЕР(!это только пример - там их больше!!)
Neverwinter Script Source
void CnrSetPersistentInt(object oHost, string sVarName, int nValue)
{
  // Change this function call to whatever function
  // should be called from the above include file
  // for storing Integers in your Database

  // uncomment the following line for NO database support
  //SetLocalInt(oHost, sVarName, nValue);

  // uncomment the following line for Bioware database support
  //SetCampaignInt("cnr_misc", sVarName, nValue, oHost);

  // uncomment the following line for APS database support
  SetPersistentInt(oHost, sVarName, nValue, 0, "cnr_misc");
}


Шаг 3.
Проверьте скрипт cnr_module_oml. Там должны быть закоментированы строчки для MS Access и раскоментированы для MySQL. Если это так - то все нормально. Если нет - раскоментируйте строчки "dor MySQL"

Шаг 4.
Если вы действительно глянули в скрипт cnr_module_oml, то должны были увидеть с самого начала функцию:
Neverwinter Script Source
ExecuteScript("aps_onload", OBJECT_SELF);
.
Хм...хм... Если вы посмотрите в списке скриптов модуля, то не найдете этого самого скрипта aps_onload. Видимо автор так устал, что совсем забыл его добавить в модуль. Чтож, вам придется самим создать скрипт с именем aps_onload и содержанием:
Neverwinter Script Source
// Name     : Avlis Persistence System OnModuleLoad
// Purpose  : Initialize APS on module load event
// Authors  : Ingmar Stieger
// Modified : January 27, 2003

// This file is licensed under the terms of the
// GNU GENERAL PUBLIC LICENSE (GPL) Version 2

#include "aps_include"

void main()
{
    // Init placeholders for ODBC gateway
    SQLInit();
}


Слава богу, инклюд aps_include в модуле присутствует. Если нет то оба скрипта можно взять в erf архиве который поставляется вместе с NWNX 2.

Все сделали? Теперь сохраняем модуль, и с полной ответственностью жмем Build Module. Ошибок нет? Тогда еще разок сохраняем.

Шаг 5.
Запускаем тот NWNX2.exe который мы с остальными файлами скопировали в директорию с NWN. У вас должно открыться окошко NWNX2 и буквально следом автоматическии окошко сервера. Запускаете наш модуль. Как только он загрузится (в состоянии будет написано Running, login at will) выключаете сначала NWNX2, затем NWSERVER.EXE. Не спрашивайте зачем - так нужно.

Теперь откройте с помощью Php My Admin базу данных "nwn". Там раньше было "nwn (-)", а теперь "nwn (5)".
Сервер при загрузке модуля созда 5(!) таблиц:
CODE

cnr_components
cnr_devices
cnr_misc
cnr_recipes
cnr_submenus    


Щелкните на cnr_misc и прокрутите окно немного вниз. Там должно быть окошко:

Выполнить SQL запрос(ы) на БД
И у меня(!) там по умолчанию написано: SELECT * FROM `cnr_misc` WHERE 1.
Сотрите это, и напишите строчку:
CODE
INSERT INTO cnr_misc (player, tag, name, val) VALUES ("~", "MODULE", "CnrBoolBuildRecipeDatabase", "1");
Где MODULE - это ТЭГ модуля.
Затем нажмите Go(Пошел) ну или как у вас там будет:).
Запрос в SQL должен выполнится без ошибок и в таблице cnr_misc появится строчка:
CODE
~ | MODULE | CnrBoolBuildRecipeDatabase | 0 | 0


Закрываем базу данных и еще раз запускаем NWNX2 и загружаем модуль. Чувствуете? Теперь он грузится чуть дольше чем в первый раз - это записываются рецепты в базу данных "nwn".

Шаг 6. Дополнение
Как утверждает автор - вы можете перезагружать рецепты "on-the-fly". Для этого следует перезарузить крафтоый аппарат к которыму добавленные рецепты относятся. Крафтовые аппараты перезагружаются при помощи SQL запроса в базу даных "nwn".
Шаблон SQL запроса:
CODE

UPDATE cnr_misc SET val = 0 WHERE name = "cnrXXX_DeviceLoaded";


Где XXX - это аппарат. В пример он приводит Наковальню для доспехов
CODE

UPDATE cnr_misc SET val = 0 WHERE name = "cnrAnvilArmor_DeviceLoaded";


И после того запроса, когда игрок будет использоваться Наковальню для доспехов - рецепты для нее будут перезагружены.

В заключении...
Можете зайти и проверить количество рецептов CNR выдает игроку при входе(их должно быть 1214 чтоль по умолчанию).
Зайдите в базы данных. Теперь вы можете просмотреть остальные 4 таблицы, которые до этого момента просмотреть было нельзя. :yahoo:

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

P.S. ВНИМАНИЕ!!! :buba:
С этого момента модуль запускать только при помощи NWNX! В противном случае данные измененные в течении игры (рецепты, опыт, скиллы) в базу данных записаны не будут.

Урок №3 объявляю завершенным :sleep:

И пока прощаюсь с вами до новых постов и (надеюсь) последующих уроков...

® Avaddon 15.11.2004

Сообщение отредактировал Аваддон - Nov 19 2004, 21:31
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
LiNuX
сообщение Nov 17 2004, 18:14
Сообщение #6


Level 1


Класс: Страж Тьмы
Характер: True Neutral
Раса: Элементаль



Вопрос :
ТЫ пишишь MySQL это одно и тоже , что и Microsoft SQL Server 2000 или SQLEXPR ?! :unsure:
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Аваддон
сообщение Nov 17 2004, 19:49
Сообщение #7


Level 10
***

Класс: Воин
Характер: Lawful Neutral
Раса: Человек
NWN: Скриптинг [PW]



Наверное все же нет. Ибо тогда не было отдельных сайтов по MySQL и собственно сайта разработчиков этой СУБД. Я вроде пояснял что SQL Server нам не подходит.
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Аваддон
сообщение Nov 19 2004, 21:29
Сообщение #8


Level 10
***

Класс: Воин
Характер: Lawful Neutral
Раса: Человек
NWN: Скриптинг [PW]



Ага! Вот и нашел свой первый недочет! Граждане, если кто промучался и выполнил все что я написал и все равно что то да неработает - я сейчас объясню в чем "фишка". У человека одного который эту систему интегрировал возникла проблема. У него есть модуль он интегрировал туда систему, потом выполнил SQL запрос и заново загрузил модуль, но рецепты не прочитались. Сейчас объясню почему. Посмотрев его базу данных в SQL я заметил что под графой "tag" в таблице cnr_misc у него вместо MODULE написано было совсем другое - что при ближайшем рассмотрении оказалось тэгом модуля. Так что учтите в
CODE
INSERT INTO cnr_misc (player, tag, name, val) VALUES ("~", "MODULE ", "CnrBoolBuildRecipeDatabase", "1");
- MODULE это тэг модуля! Он может быть любым какой вы зададите в свойствах модуля. Следовательно запрос должен быть таким
CODE
INSERT INTO cnr_misc (player, tag, name, val) VALUES ("~", "ТЭГ_МОДУЛЯ ", "CnrBoolBuildRecipeDatabase", "1");
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Life
сообщение Aug 13 2010, 20:18
Сообщение #9


Level 2
*

Класс: Маг
Характер: Lawful Evil
Раса: Полуэльф



Апну старую тему (:

Поставил себе mysql, nwnx2, cnr.
И такая проблема: в базу рецепты и т.п. на русском пишет нормально, а при чтении из базы выводятся вопросы вместо русских букв.
Не знаете в чем может быть проблема?


Сообщение отредактировал Life - Aug 14 2010, 14:00
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Lex
сообщение Aug 14 2010, 04:44
Сообщение #10


Level 5
Иконки Групп

Класс: Обыватель
Характер: Lawful Neutral
Раса: Человек
NWN: Модмейкер
Проклятие Левора
Порядок Времени



база в какой кодировке?
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения
Life
сообщение Aug 14 2010, 08:21
Сообщение #11


Level 2
*

Класс: Маг
Характер: Lawful Evil
Раса: Полуэльф



система winXP
в базе cp1251

CODE
+--------------------------+----------------------------------+
| Variable_name            | Value                            |
+--------------------------+----------------------------------+
| character_set_client     | cp1251                           |
| character_set_connection | cp1251                           |
| character_set_database   | cp1251                           |
| character_set_filesystem | binary                           |
| character_set_results    | cp1251                           |
| character_set_server     | cp1251                           |
| character_set_system     | utf8                             |



п.с. проблема решилась установкой в настройках ODBC драйвера кодировки cp1251.

Сообщение отредактировал Life - Aug 14 2010, 11:16
Вернуться в начало страницы
Скопировать ник в поле быстрого ответа
+Ответить с цитированием данного сообщения

Ответить в эту темуОткрыть новую тему
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



Текстовая версия Сейчас: 29th March 2024 - 02:30