• Уважаемые гости и новички, приветствуем Вас на нашем форуме
    Здесь вы можете найти ответы практически на все свои вопросы о серии игр «Готика» (в том числе различных модах на нее), «Ведьмак», «Ризен», «Древние свитки», «Эра дракона» и о многих других играх. Можете также узнать свежие новости о разработке новых проектов, восхититься творчеством наших форумчан, либо самим показать, что вы умеете. Ну и наконец, можете обсудить общие увлечения или просто весело пообщаться с посетителями «Таверны».

    Чтобы получить возможность писать на форуме, оставьте сообщение в этой теме.
    Удачи!

Вопросы по скриптингу

MaGoth

★★★★★★★★★★★
Администратор
Регистрация
7 Янв 2003
Сообщения
19.367
Благодарности
7.815
Баллы
995
  • Первое сообщение
  • #1
Прежде чем задавать вопросы, ознакомьтесь с документацией..
1) Читать онлайн
2) Архив с офлайн-версией(chm) во вложении
 

Вложения

  • Vam_tutor.rar
    171,6 KB · Просмотры: 573
Последнее редактирование модератором:

MaGoth

★★★★★★★★★★★
Администратор
Регистрация
7 Янв 2003
Сообщения
19.367
Благодарности
7.815
Баллы
995
Оверлеи - это такая глючная вещь...
Это наверное от того, что не умеете их готовить ?! ::)
Никакой глючности не видел если делать все правильно, только одни +++
 

unknown111

Участник форума
Регистрация
5 Фев 2013
Сообщения
1.075
Благодарности
1.586
Баллы
290
можно ли активировать эвент без триггера только с помощью скрипта, например при активации флага и т.п.?
и как можно вывести в меню отображение других типов защит? немного поковырялся и пришел к выводу что там ограничение на 4 типа привязанных к индексу дмг... так ли это?
 

MaGoth

★★★★★★★★★★★
Администратор
Регистрация
7 Янв 2003
Сообщения
19.367
Благодарности
7.815
Баллы
995
можно ли активировать эвент без триггера только с помощью скрипта, например при активации флага и т.п.?
Что за эвент, от чего и для чего ?!

и как можно вывести в меню отображение других типов защит? немного поковырялся и пришел к выводу что там ограничение на 4 типа привязанных к индексу дмг... так ли это?
1. Сколько указано параметров защит в классе движка столько и выводить можно.
2. Для того чтобы это реализовать надо все их(или требуемые) прописать в инстанциях: предметов, непесей и т.д. и т.п..
3. Про 4 типа ничего не понял, смотри параметры защит в файле Constants.d каталога ..\GOTHIC\_Intern
 

unknown111

Участник форума
Регистрация
5 Фев 2013
Сообщения
1.075
Благодарности
1.586
Баллы
290
Что за эвент, от чего и для чего ?!

вот что я имею ввиду под Эвентом
Код:
var int EVT_CRYPT_01_OneTime;

func void evt_crypt_01()
{
if(EVT_CRYPT_01_OneTime == FALSE)
{
Wld_InsertNpc(Lesser_Skeleton,"EVT_CRYPT_ROOM_01_SPAWN_01");
Wld_InsertNpc(Lesser_Skeleton,"EVT_CRYPT_ROOM_01_SPAWN_02");
Wld_InsertNpc(Skeleton,"EVT_CRYPT_ROOM_01_SPAWN_03");
Wld_InsertNpc(Skeleton,"EVT_CRYPT_ROOM_01_SPAWN_04");
Wld_InsertNpc(Lesser_Skeleton,"EVT_CRYPT_ROOM_01_SPAWN_05");
Wld_InsertNpc(Lesser_Skeleton,"EVT_CRYPT_ROOM_01_SPAWN_06");
Wld_InsertNpc(SkeletonMage,"EVT_CRYPT_ROOM_01_SPAWN_07");
EVT_CRYPT_01_OneTime = TRUE;
};
};

1. Сколько указано параметров защит в классе движка столько и выводить можно.
2. Для того чтобы это реализовать надо все их(или требуемые) прописать в инстанциях: предметов, непесей и т.д. и т.п..
3. Про 4 типа ничего не понял, смотри параметры защит в файле Constants.d каталога ..\GOTHIC\_Intern
дело в том что в меню пираньи вывели только 4 типа защиты : оружие, стрелы, огонь дракона, магия...
под Оружие пираньи вывели защиту от дробящего, и особо не парясь, сделали защиту от режущего и дробящего на всех арморах одинаковую...
мне же нужно вывести отображение режущего, но мои попытки привели к тому что могу вывести только название а кол-во никак не выходит.
в Menu.dat есть только 4 инстанции MENU_ITEM_ARMOR, которые привязаны к индексу дмг в Constants.d, создание новых инстанций никчему не приводит так как я не понимаю за счет чего осуществлена связь с индексом...
как то так...
 

MaGoth

★★★★★★★★★★★
Администратор
Регистрация
7 Янв 2003
Сообщения
19.367
Благодарности
7.815
Баллы
995
вот что я имею ввиду под Эвентом
Прописываешь вызов функции в коде скрипта где требуется, должно все работать без проблем..

дело в том что в меню пираньи вывели только 4 типа защиты
Если прописано в классе движка, то значит с этим можно делать все что угодно, по аналогии с прописанными там ранее. Т.е. смотри что было сделано для вывода тех параметров которые работают и делай по аналогии. Надо будет править файлы скриптов в обеих датниках - Готик и Меню.
 

unknown111

Участник форума
Регистрация
5 Фев 2013
Сообщения
1.075
Благодарности
1.586
Баллы
290
Прописываешь вызов функции в коде скрипта где требуется, должно все работать без проблем.
а вот с этого места можно и по подробнее...
я ведь лучший скриптер в мире :{
команда на вызов эвентов какая?
если просто инзертить НПС'ов в нужном мне скрипте игру вышибает без разбирательств..
только в диалогах работает инзерт

Т.е. смотри что было сделано для вывода тех параметров которые работают и делай по аналогии. Надо будет править файлы скриптов в обеих датниках - Готик и Меню.
есть instance MENU_ITEM_ARMOR с 1 по 4 и все, вся их разница в 1,2,3 или 4. эти циферки каким-то боком привязаны к индексу в constants.d, и проблема состоит в том, что больше никакие циферки не привязаны,
перебрал до 20...
так вот... как мне привязать новую циферку к индексу режущего дмг?! :)
я могу вывести абсолютно любой имеющийся тип защиты, но только в эти инсты (от instance MENU_ITEM_ARMOR_1 до instance MENU_ITEM_ARMOR_4)
 

MaGoth

★★★★★★★★★★★
Администратор
Регистрация
7 Янв 2003
Сообщения
19.367
Благодарности
7.815
Баллы
995
команда на вызов эвентов какая?
Полагаю что эта:
Код:
func void evt_crypt_01()
Ибо я понятия не имею что ты там делаешь в своем проекте..
Т.е. в нужном тебе диалоге, после выполненного условия прописываешь эту функцию с последующей вставкой непесей в мир (как в твоем примере ранее)...
В готик.срц, эта функция должна быть прописана выше чем скрипт с диалогом откуда она вызывается,
Примерно так, ибо проверить в игре не смогу..
есть instance MENU_ITEM_ARMOR с 1 по 4
У этого ноги растут из файла ..\Menu\Menu_Status.d, поковыряйся там, найдешь много интересного..
 

Dimus

★★★★★★★★★
Супермодератор
Регистрация
19 Июл 2010
Сообщения
5.574
Благодарности
4.168
Баллы
915
У меня появились вопросы:
1. Почему использование в функции Wld_InsertNpc (int npcInstance, string spawnPoint); глобальных переменных типа C_Npc, описанных в скрипте Story\Npc_Globals.d, может вызывать безлоговые вылеты из G2a?
2. Зачем сделан двойной вызов функции AI_Teleport(npc,"TOT"):
Код:
func void B_RemoveNpc(var int npcInstance)
{
    var C_Npc npc;
    npc = Hlp_GetNpc(npcInstance);
    if(Hlp_IsValidNpc(npc) && !Npc_IsDead(npc))
    {
        npc.flags = 0;
        AI_Teleport(npc,"TOT");
        B_StartOtherRoutine(npc,"TOT");
        Npc_ChangeAttribute(npc,ATR_HITPOINTS,-npc.attribute[ATR_HITPOINTS_MAX]);
        AI_Teleport(npc,"TOT");
    };
};
Разобрался сам - без двойного вызова этой функции труп NPC почему-то не попадает в морг локации.
 

Haart

Участник форума
Регистрация
24 Окт 2011
Сообщения
188
Благодарности
106
Баллы
185
Хм, как можно сделать, что-бы по, например, стреле можно было кликнуть, т.е. что-бы после клика выполнялась нужная функция ?
 

НастасьСанна

Участник форума
Регистрация
6 Дек 2012
Сообщения
350
Благодарности
521
Баллы
325
1. Почему использование в функции Wld_InsertNpc (int npcInstance, string spawnPoint); глобальных переменных типа C_Npc, описанных в скрипте Story\Npc_Globals.d, может вызывать безлоговые вылеты из G2a?
Потому что в глоб. переменные npc записываются только после вставки в мир. До тех пор там пустота. Пустая переменная в Wld_InsertNpc => вставить "никого" => вылет. И даже после вставки глоб. переменные сразу не заполняются, только после входа в мир/загрузки игры (B_InitNpcGlobals вызывается только в Startup.d).

Haart, кликнуть в инвентаре или на локации?
Если в инвентаре, то навесить стреле scemeName = "MAP" (или другую подходящую) и в on_state[0] прописать нужную функцию.
Если на локе, то сделать стрелу интерактивным VOB'ом и подключить триггер-скрипт, но тогда подобрать ее будет нельзя.
 

Haart

Участник форума
Регистрация
24 Окт 2011
Сообщения
188
Благодарности
106
Баллы
185
Ага, спасибо) А вот такой вопрос, хочу сделать, яд или замедление на время, есть ли функция, для этого самого времени... желательно в секундах)
 

НастасьСанна

Участник форума
Регистрация
6 Дек 2012
Сообщения
350
Благодарности
521
Баллы
325
Нет, встроенной функции нет. Нужен циклический триггер. Урок можно найти в сети.
 

Dimus

★★★★★★★★★
Супермодератор
Регистрация
19 Июл 2010
Сообщения
5.574
Благодарности
4.168
Баллы
915
Уважаемые знатоки! Пожалуйста помогите исправить старый баг аддона, возникающий при продаже мечей Хараду. Глюки начинаются в случае, если ГГ экипировался одним из таких мечей. Например, у ГГ есть 2 обычных меча (ItMw_1H_Common_01), один из них висит на поясе. Количество продаваемых мечей и плата за них рассчитываются правильно (150 золота за 1 меч), но почему-то ГГ снимает с пояса меч, и в его инвентаре остаются 2 меча. Попытка разоружения ГГ функцией AI_UnequipWeapons(other) перед передачей мечей ничего не даёт. Вот код этой функции из скрипта Story\Dialoge\DIA_VLK_412_Harad.d:

Код:
func void DIA_Harad_SellBlades_Info()
{
    var C_Item EquipWeap;
    var int anzahl_common;
    var int anzahl_schwert1;
    var int anzahl_schwert4;
    var int anzahl_rubinklinge;
    var int anzahl_elbastardo;
    var int gesamt;
    var string concatText;
    var int lohn;
    AI_Output(other,self,"DIA_Harad_SellBlades_15_00");    //Я хочу продать оружие, выкованное мной.
    EquipWeap = Npc_GetEquippedMeleeWeapon(other);
    anzahl_common = Npc_HasItems(other,ItMw_1H_Common_01);
    if(Hlp_IsItem(EquipWeap,ItMw_1H_Common_01))
    {
        anzahl_common -= 1;
    };
    anzahl_schwert1 = Npc_HasItems(other,ItMw_Schwert1);
    if(Hlp_IsItem(EquipWeap,ItMw_Schwert1))
    {
        anzahl_schwert1 -= 1;
    };
    anzahl_schwert4 = Npc_HasItems(other,ItMw_Schwert4);
    if(Hlp_IsItem(EquipWeap,ItMw_Schwert4))
    {
        anzahl_schwert4 -= 1;
    };
    anzahl_rubinklinge = Npc_HasItems(other,ItMw_Rubinklinge);
    if(Hlp_IsItem(EquipWeap,ItMw_Rubinklinge))
    {
        anzahl_rubinklinge -= 1;
    };
    anzahl_elbastardo = Npc_HasItems(other,ItMw_ElBastardo);
    if(Hlp_IsItem(EquipWeap,ItMw_ElBastardo))
    {
        anzahl_elbastardo -= 1;
    };
    gesamt = anzahl_common + anzahl_schwert1 + anzahl_schwert4 + anzahl_rubinklinge + anzahl_elbastardo;
    if(gesamt == 0)
    {
        if(Hlp_IsItem(EquipWeap,ItMw_1H_Common_01) || Hlp_IsItem(EquipWeap,ItMw_Schwert1) || Hlp_IsItem(EquipWeap,ItMw_Schwert4) || Hlp_IsItem(EquipWeap,ItMw_Rubinklinge) || Hlp_IsItem(EquipWeap,ItMw_ElBastardo))
        {
            AI_Output(self,other,"DIA_Harad_SellBlades_12_01");    //Все, что у тебя есть - это меч, висящий на поясе. Ты лучше оставь его себе.
        }
        else
        {
            AI_Output(self,other,"DIA_Harad_SellBlades_12_04");    //Тогда сделай его! Я принимаю только обычные мечи.
        };
    }
    else
    {
        AI_Output(self,other,"DIA_Harad_SellBlades_12_02");    //Хорошо - давай сюда.
        Npc_RemoveInvItems(other,ItMw_1H_Common_01,anzahl_common);
        Npc_RemoveInvItems(other,ItMw_Schwert1,anzahl_schwert1);
        Npc_RemoveInvItems(other,ItMw_Schwert4,anzahl_schwert4);
        Npc_RemoveInvItems(other,ItMw_Rubinklinge,anzahl_rubinklinge);
        Npc_RemoveInvItems(other,ItMw_ElBastardo,anzahl_elbastardo);
        concatText = ConcatStrings(IntToString(gesamt),PRINT_ItemsGegeben);
        AI_PrintScreen(concatText,-1,YPOS_ItemGiven,FONT_ScreenSmall,2);
        AI_Output(self,other,"DIA_Harad_SellBlades_12_03");    //Отлично. Держи, что заработал.
        lohn = ((anzahl_common * Value_Common1) + (anzahl_schwert1 * Value_Schwert1) + (anzahl_schwert4 * Value_Schwert4) + (anzahl_rubinklinge * Value_Rubinklinge) + (anzahl_elbastardo * Value_ElBastardo)) / 3;
        B_GiveInvItems(self,other,ItMi_Gold,lohn);
    };
};
 

Dimmell

Участник форума
Регистрация
23 Ноя 2008
Сообщения
2.899
Благодарности
111
Баллы
285
Dimus

Код:
AI_Output(other,self,"DIA_Harad_SellBlades_15_00");    //Я хочу продать выкованное оружие.
    EquipWeap = Npc_GetEquippedMeleeWeapon(other);
    anzahl_common = Npc_HasItems(other,ItMw_1H_Common_01);
    if(Hlp_IsItem(EquipWeap,ItMw_1H_Common_01) == TRUE)
    {
        if(anzahl_common > 1)
        {
            Npc_RemoveInvItems(other,ItMw_1H_Common_01,anzahl_common);
        };
        anzahl_common -= 1;
    };
    anzahl_schwert1 = Npc_HasItems(other,ItMw_Schwert1);
    if(Hlp_IsItem(EquipWeap,ItMw_Schwert1) == TRUE)
    {
        if(anzahl_schwert1 > 1)
        {
            Npc_RemoveInvItems(other,ItMw_Schwert1,anzahl_schwert1);
        };
        anzahl_schwert1 = anzahl_schwert1 - 1;
    };
    anzahl_schwert4 = Npc_HasItems(other,ItMw_Schwert4);
    if(Hlp_IsItem(EquipWeap,ItMw_Schwert4) == TRUE)
    {
        if(anzahl_schwert4 > 1)
        {
            Npc_RemoveInvItems(other,ItMw_Schwert4,anzahl_schwert4);
        };
        anzahl_schwert4 = anzahl_schwert4 - 1;
    };
    anzahl_rubinklinge = Npc_HasItems(other,ItMw_Rubinklinge);
    if(Hlp_IsItem(EquipWeap,ItMw_Rubinklinge) == TRUE)
    {
        if(anzahl_rubinklinge > 1)
        {
            Npc_RemoveInvItems(other,ItMw_Rubinklinge,anzahl_rubinklinge);
        };
        anzahl_rubinklinge = anzahl_rubinklinge - 1;
    };
    anzahl_elbastardo = Npc_HasItems(other,ItMw_ElBastardo);
    if(Hlp_IsItem(EquipWeap,ItMw_ElBastardo) == TRUE)
    {
        if(anzahl_elbastardo > 1)
        {
            Npc_RemoveInvItems(other,ItMw_ElBastardo,anzahl_elbastardo);
        };
        anzahl_elbastardo = anzahl_elbastardo - 1;
    };
    gesamt = anzahl_common + anzahl_schwert1 + anzahl_schwert4 + anzahl_rubinklinge + anzahl_elbastardo;
 

Ur-tRall

Участник форума
Регистрация
16 Май 2009
Сообщения
4.100
Благодарности
2.123
Баллы
475
Мне кажется с функцией EquipWeap = Npc_GetEquippedMeleeWeapon(other); что-то не так. Помнится когда исправляли ошибки Исхода, нужно было удалить парочку строчек. Здесь их нет, хотя по всей видимости те строчки и удалялись с этой целью. И мне казалось, что в скрипте по разоружению\вооружению должно стоять больше функций.
 

Dimus

★★★★★★★★★
Супермодератор
Регистрация
19 Июл 2010
Сообщения
5.574
Благодарности
4.168
Баллы
915
@ Dimmell:
Т.е. мечи из инвентаря ГГ удаляются сразу без дополнительных проверок и фраз кузнеца? Это немного не то, что нужно.
 

Dimmell

Участник форума
Регистрация
23 Ноя 2008
Сообщения
2.899
Благодарности
111
Баллы
285
Т.е. мечи из инвентаря ГГ удаляются сразу без дополнительных проверок и фраз кузнеца? Это немного не то, что нужно.
Вот полная функция из Ребаланса 2.1:
Код:
func void DIA_Harad_SellBlades_Info()
{
    var C_Item EquipWeap;
    var int anzahl_common;
    var int anzahl_schwert1;
    var int anzahl_schwert4;
    var int anzahl_rubinklinge;
    var int anzahl_elbastardo;
    var int gesamt;
    var string concatText;
    var int lohn;
    var int del_common;
    var int del_schwert1;
    var int del_schwert4;
    var int del_rubinklinge;
    var int del_elbastardo;
    AI_Output(other,self,"DIA_Harad_SellBlades_15_00");    //Я хочу продать выкованное оружие.
    EquipWeap = Npc_GetEquippedMeleeWeapon(other);
    anzahl_common = Npc_HasItems(other,ItMw_1H_Common_01);
    if(Hlp_IsItem(EquipWeap,ItMw_1H_Common_01) == TRUE)
    {
        if(anzahl_common > 1)
        {
            Npc_RemoveInvItems(other,ItMw_1H_Common_01,anzahl_common);
        };
        anzahl_common -= 1;
    };
    anzahl_schwert1 = Npc_HasItems(other,ItMw_Schwert1);
    if(Hlp_IsItem(EquipWeap,ItMw_Schwert1) == TRUE)
    {
        if(anzahl_schwert1 > 1)
        {
            Npc_RemoveInvItems(other,ItMw_Schwert1,anzahl_schwert1);
        };
        anzahl_schwert1 = anzahl_schwert1 - 1;
    };
    anzahl_schwert4 = Npc_HasItems(other,ItMw_Schwert4);
    if(Hlp_IsItem(EquipWeap,ItMw_Schwert4) == TRUE)
    {
        if(anzahl_schwert4 > 1)
        {
            Npc_RemoveInvItems(other,ItMw_Schwert4,anzahl_schwert4);
        };
        anzahl_schwert4 = anzahl_schwert4 - 1;
    };
    anzahl_rubinklinge = Npc_HasItems(other,ItMw_Rubinklinge);
    if(Hlp_IsItem(EquipWeap,ItMw_Rubinklinge) == TRUE)
    {
        if(anzahl_rubinklinge > 1)
        {
            Npc_RemoveInvItems(other,ItMw_Rubinklinge,anzahl_rubinklinge);
        };
        anzahl_rubinklinge = anzahl_rubinklinge - 1;
    };
    anzahl_elbastardo = Npc_HasItems(other,ItMw_ElBastardo);
    if(Hlp_IsItem(EquipWeap,ItMw_ElBastardo) == TRUE)
    {
        if(anzahl_elbastardo > 1)
        {
            Npc_RemoveInvItems(other,ItMw_ElBastardo,anzahl_elbastardo);
        };
        anzahl_elbastardo = anzahl_elbastardo - 1;
    };
    gesamt = anzahl_common + anzahl_schwert1 + anzahl_schwert4 + anzahl_rubinklinge + anzahl_elbastardo;
    if(gesamt == 0)
    {
        if((Hlp_IsItem(EquipWeap,ItMw_1H_Common_01) == TRUE) || (Hlp_IsItem(EquipWeap,ItMw_Schwert1) == TRUE) || (Hlp_IsItem(EquipWeap,ItMw_Schwert4) == TRUE) || (Hlp_IsItem(EquipWeap,ItMw_Rubinklinge) == TRUE) || (Hlp_IsItem(EquipWeap,ItMw_ElBastardo) == TRUE))
        {
            AI_Output(self,other,"DIA_Harad_SellBlades_12_01");    //Тебе принадлежит только то, что весит у тебя на поясе. Присматривай за ним получше.
        }
        else
        {
            AI_Output(self,other,"DIA_Harad_SellBlades_12_04");    //Так сделай его! Я принимаю только простые мечи.
        };
    }
    else
    {
        AI_Output(self,other,"DIA_Harad_SellBlades_12_02");    //Хорошо - давай сюда.
        if(Hlp_IsItem(EquipWeap,ItMw_1H_Common_01) != TRUE)
        {
            Npc_RemoveInvItems(other,ItMw_1H_Common_01,anzahl_common);
        };
        if(Hlp_IsItem(EquipWeap,ItMw_Schwert1) != TRUE)
        {
            Npc_RemoveInvItems(other,ItMw_Schwert1,anzahl_schwert1);
        };
        if(Hlp_IsItem(EquipWeap,ItMw_Schwert4) != TRUE)
        {
            Npc_RemoveInvItems(other,ItMw_Schwert4,anzahl_schwert4);
        };
        if(Hlp_IsItem(EquipWeap,ItMw_Rubinklinge) != TRUE)
        {
            Npc_RemoveInvItems(other,ItMw_Rubinklinge,anzahl_rubinklinge);
        };
        if(Hlp_IsItem(EquipWeap,ItMw_ElBastardo) != TRUE)
        {
            Npc_RemoveInvItems(other,ItMw_ElBastardo,anzahl_elbastardo);
        };
        concatText = b_formgivestring(other,gesamt);
        AI_PrintScreen(concatText,-1,YPOS_ItemGiven,FONT_ScreenSmall,2);
        AI_Output(self,other,"DIA_Harad_SellBlades_12_03");    //Так, а вот и твоя зарплата.
        lohn = (anzahl_common * 60) + (anzahl_schwert1 * 80) + (anzahl_schwert4 * 100) + (anzahl_rubinklinge * 120) + (anzahl_elbastardo * 140);
        B_GiveInvItems(self,other,ItMi_Gold,lohn);
    };
};
Хотел дать возможность додумать немного самим... Но раз вы не хотите :)
Если диалог начался - Харад все равно удалит мечи в количестве > 1, вначале очищается инвентарь, потом идет проверка "если один висит на поясе" и т.д.
 

Ur-tRall

Участник форума
Регистрация
16 Май 2009
Сообщения
4.100
Благодарности
2.123
Баллы
475
Многовато додумывать бы пришлось.
 

Dimmell

Участник форума
Регистрация
23 Ноя 2008
Сообщения
2.899
Благодарности
111
Баллы
285
Многовато додумывать бы пришлось.
это писалось еще для 1-го ребаланса, сейчас написалось бы покрасивше и возможно немного по-другому. Но тогда додумалось так :)
 

unknown111

Участник форума
Регистрация
5 Фев 2013
Сообщения
1.075
Благодарности
1.586
Баллы
290
почему если создать новый атрибут (допустим интеллект), используя слот под таланты, при повышении этого атрибута больше 100, после загрузки игры он визуально сбрасывается до 1, но при этом остается выше 100? (если после загрузки еще раз поднять его хотя бы на 1, то отобразится его верное кол-во)
именно больше 100, до 100 и 100 при загрузке сохраняются...
учитывается вроде корректно, учителя не учат по достижении лимита и т.п.
может кто сталкивался с подобным?

з.ы. наглядный пример
111.jpg
 
Сверху Снизу