Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Город Мастеров _ Neverwinter Nights 2 Obsidian Toolset _ Рендомная система лута

Автор: Vanes May 4 2007, 16:14

видел на некоторые буржуйских шардах подобие этой системы...
так что мне даже обидно за наших, что на русских шардах это еще не сделали...

в общем выкладываю свои скрипты рендомного лута...
система проверенная, работающая 2 года на шарде Валидор2...
к сожалению в нвн2 пока не разобрался как внешний вид шмоток скриптами изменять, потому пришлось вместо одной болванки создавать много и использовать банальные
sBaseItemTag = "vr_belt"+IntToString(Random(18));
oBaseItem = CreateItemOnObject(sBaseItemTag, oContainer);

скрипт первый, основной...
используется как инклуд в ондес моба, онюз ящика и т.п.
запускается функцией void RandomLoot(int nCR, object oContainer, string sSpec)

Neverwinter Script Source
// for NWN Shard "Validor 2"
// main script
/* Scripted by Vanes */

#include "vns_loot_iptable"
#include "vns_loot_inc"
#include "vr_inc_code"

struct stItemProperty
{
    int n;
    itemproperty ip;
    int subgrp;
    int price;
    string s; /* all prices in one string */
    int nGC; /* Group Coefficient, f.e. for enhancement nCG=5, +1 enhancement
                for every 5 points of CR*/

    int nGM; /* Group Multiplier, f.e. for abilities nGM=6, because we have
                6 abilities to increase*/
// NOT USED
};

string sCreatedItemTag;
string sAppID;

// Creating bollte/healers kit in loot bag.
// nCR - mob's Chalendge Raiting
void CreateBottleInLoot(int nCR, object oContainer);

// Creating scroll in loot bag.
// nCR - mob's Chalendge Raiting
void CreateScrollInLoot(int nCR, object oContainer);

// Creating money in loot bag.
// nAmount - amount of gold to create.
void CreateMoneyInLoot(int nAmount, object oContainer);

// Creating misc in loot bag.
// nCR - mob's Chalendge Raiting
void CreateMiscInLoot(int nCR, object oContainer);

// Creating "rar" item in loot bag.
// nCR - mob's Chalendge Raiting
void CreateRARInLoot(int nCR, object oContainer);

void CreateMapInLoot(int nCR, object oContainer);

// Creating item in loot.
// nType = 1:"belt", 2:"boots", 3:"cloak", 4:"gauntlet", 5:"ring", 6:"amulet", 7:"helmet",
//         8:"sling", 9:"dart", 10:"shuriken"
// nCR - mob's Chalendge Raiting
void CreateItemInLoot(int nType, int nCR, object oContainer);

// Creating item in loot.
// nCR - mob's Chalendge Raiting
void CreateAmmoInLoot(int nCR, object oContainer);

// 10% - creating items
// 5% - creating scrolls
// 85% - only money
int roulette1(int r1);

//20% - creating weapons
//15% - creating armor
//12% - creating shields
//10% - creating magic items (staffs, rods, wands)
//6% - creating clothes (rings, amulets, cloaks, bracers/gauntlets, helmets, boots,  belts
//1% - creating "rar" items
int roulette2();

// "Roulette" for choosing one IP from group.
// nNumber - Group Number (1-enhancement, 2-attack, 301-damage(simple), 302-damage(exotic),
// 4-AC, 5-reduction, 601-resist(simple), 602-resist(exotic), 7-regeneration,
//8-weight_redustion, 9-ability, 10-skill, 1101-save(simple), 1102-save(universal)
// nCR - mob's Chalendge Raiting
// nPoints - remaining points to adding IP
// bMainGroup - flag for main group (first group)
// oItem - item to adding IP.
int MyAddItemProperty (int nTableNumber, int nCR, int nPoints, int bMainGroup, object oItem);

void RandomLoot(int nCR, object oContainer, string sSpec)
{
//    nCR = 40; // test
//    SendMessageToPC(GetFirstPC(), "nCR=20");
    // --- PvP Bonus
    int i=1;
    if(sSpec=="25%bonus")
        if(d4()==1) i=2;
    else if(sSpec=="50%bonus")
        if(d2()==1) i=2;
    else if(sSpec=="75%bonus")
        if(d4()!=1) i=2;

    int r1 = 0;
    if(sSpec=="N5_100%_ELITE_MOB"){
        r1=3;
        i=5;
    }
    if(sSpec=="N10_100%_ELITE_MOB"){
        r1=3;
        i=10;
    }
    if(sSpec=="100%_TREASURE"){
        r1=3;
    }
    if(FindSubString(sSpec, "100%_NESP_MOB")!=-1){
        r1=3;
        nCR+=4;
        int nNESPLvl = StringToInt(GetStringRight(sSpec, 1));
        if(nNESPLvl>=3){
            CreateItemOnObject("perfectcrystall", oContainer);
        }else if(nNESPLvl==2){
            if(d2()==1) CreateItemOnObject("perfectcrystall", oContainer);
        }else if(nNESPLvl==1){
            if(d4()==1) CreateItemOnObject("perfectcrystall", oContainer);
        }

    }
//SendMessageToPC(GetFirstPC(), "Loot scrint running...");
    switch(roulette1(r1)){
        case 1: CreateMoneyInLoot(d10(nCR)*3, oContainer); break; // only money
        case 2: CreateMoneyInLoot(d10(nCR)*2, oContainer);      // money and misc
                CreateMiscInLoot(nCR, oContainer); break;
        case 3: CreateMoneyInLoot(d10(nCR)*2, oContainer); // money and item
                while(i>0){
                //SendMessageToPC(GetFirstPC(), "item in loot");
                    // --- Lost Property Fix
                    sCreatedItemTag = "";
                    sAppID = "";
                    switch(roulette2()){
                        case 1: CreateRARInLoot(nCR, oContainer); break; // "rar" items
                        case 2: CreateItemInLoot(1, nCR, oContainer); break; // belts
                        case 3: CreateItemInLoot(2, nCR, oContainer); break; // boots
                        case 4: CreateItemInLoot(3, nCR, oContainer); break; // cloaks
                        case 5: CreateItemInLoot(4, nCR, oContainer); break; // bracers/gauntlets
                        case 6: CreateItemInLoot(5, nCR, oContainer); break; // rings
                        case 7: CreateItemInLoot(6, nCR, oContainer); break; // amulets
                        case 8: CreateItemInLoot(7, nCR, oContainer); break; // helmets
                        case 9: CreateItemInLoot(8, nCR, oContainer); break; // magic items
                        case 10: CreateItemInLoot(9, nCR, oContainer); break; // shields
                        case 11: CreateItemInLoot(10, nCR, oContainer); break; // armor
                        case 12: CreateItemInLoot(11, nCR, oContainer); break; // ranged weapons
                        case 13: CreateItemInLoot(12, nCR, oContainer); break; // weapons
                    }
                    i--;
                }
                break;
        case 4: CreateMoneyInLoot(d10(nCR)*2, oContainer); // money & ammo
                while(i>0){
                    CreateAmmoInLoot(nCR, oContainer);
                    i--;
                }
                break;
    }

    CreateMapInLoot(nCR, oContainer);
    if(d2()==1) CreateScrollInLoot(nCR, oContainer);
    if(d2()==1) CreateBottleInLoot(nCR, oContainer);
}

// ---------------------------------------------------------------
int roulette1(int r1)
{
    //return 3; // test
    if(r1!=0) return r1;
    int dice = d100(1);
    if(dice==5 || dice==15 || dice==25 || dice==35 || dice==45 || dice==55 ||
       dice==65 || dice==75 || dice==85 || dice==95 ||
       dice==6 || dice==16 || dice==26 || dice==36 || dice==46 || dice==56 ||
       dice==66 || dice==76 || dice==86 || dice==96 ||
       dice==7 || dice==17 || dice==27 || dice==37 || dice==47 || dice==57 ||
       dice==67 || dice==77 || dice==87 || dice==97 ||
       dice==8 || dice==18 || dice==28 || dice==38 || dice==48 || dice==58 ||
       dice==68 || dice==78 || dice==88 || dice==98) return 3; // money & item

    if(dice==13 || dice==53) return 2; // money & misc

    if(dice==20 || dice==40 || dice==60 || dice==80 || dice==90 ||
       dice==10 || dice==30 || dice==50 || dice==70 || dice==100) return 4; // money & ammo

    return 1;              // only money
}
// ---------------------------------------------------------------
int roulette2()
{
    int dice = d100(1);
    if(dice<=15) return 13; // weapons
    if(dice<=22) return 12; // ranged weapons
    if(dice<=37) return 11; // armor
    if(dice<=47) return 10; // shields
    if(dice<=57) return 9// magic items
    if(dice<=63) return 8// helmets
    if(dice<=69) return 7// amulets
    if(dice<=75) return 6// rings
    if(dice<=81) return 5// bracers/gauntlets
    if(dice<=87) return 4// cloaks
    if(dice<=93) return 3// boots
    if(dice<=99) return 2// belts
    return 1;               // "rar" items

    //return 11;
}
// ---------------------------------------------------------------
void CreateMoneyInLoot(int nAmount, object oContainer)
{
    object oKiller = GetLastKiller();
    object oBag = GetLocalObject(oKiller, "nMoneyBag");
    int nPercent = GetLocalInt(oBag, "nPercent");   
    int nMoney = GetLocalInt(oBag, "nAmount");
    int nPart = nAmount*nPercent/100;   
   
    SetLocalInt(oBag, "nAmount", nMoney+nPart);
    SetFirstName(oBag, "Money Bag: "+IntToString(nMoney+nPart)+"gp");
   
    SendMessageToPC(oKiller, "Money Bag: added "+IntToString(nPart)+"gp.");
      
    CreateItemOnObject("nw_it_gold001", oContainer, nAmount-nPart);
}
// ---------------------------------------------------------------
void CreateMapInLoot(int nCR, object oContainer)
{
    // --- 10% chance of drop map in loot
    if(d20()!=10) return;

    object oMap;

    int nDice, nNumItems;
    nDice = d100();
    if(nDice<=10) nNumItems = 5;
    else if(nDice<=30) nNumItems = 4;
    else if(nDice<=60) nNumItems = 3;
    else if(nDice<=100) nNumItems = 2;

    if(nCR<15) return;
    if(nCR<20){
        // 20th lvl map
        oMap = CreateItemOnObject("vr_unindmap", oContainer);
        CopyObject(oMap, GetLocation(oContainer), oContainer, GetTag(oMap)+"1"+IntToString(nNumItems));
        DestroyObject(oMap);
        return;
    }
    if(nCR<25){
        nDice = d2();
        if(nDice==1){ // 20th lvl map
            oMap = CreateItemOnObject("vr_unindmap", oContainer);
            CopyObject(oMap, GetLocation(oContainer), oContainer, GetTag(oMap)+"1"+IntToString(nNumItems));
            DestroyObject(oMap);
            return;
        }else{ // 25th lvl map
            oMap = CreateItemOnObject("vr_unindmap", oContainer);
            CopyObject(oMap, GetLocation(oContainer), oContainer, GetTag(oMap)+"2"+IntToString(nNumItems));
            DestroyObject(oMap);
            return;
        }
        return;
    }
    if(nCR<30){
        nDice = d2();
        if(nDice==1){ // 25th lvl map
            oMap = CreateItemOnObject("vr_unindmap", oContainer);
            CopyObject(oMap, GetLocation(oContainer), oContainer, GetTag(oMap)+"2"+IntToString(nNumItems));
            DestroyObject(oMap);
            return;
        }else{ // 30th lvl map
            oMap = CreateItemOnObject("vr_unindmap", oContainer);
            CopyObject(oMap, GetLocation(oContainer), oContainer, GetTag(oMap)+"3"+IntToString(nNumItems));
            DestroyObject(oMap);
            return;
        }
        return;
    }
    if(/*nCR<35*/TRUE){
        nDice = d2();
        if(nDice==1){ // 30th lvl map
            oMap = CreateItemOnObject("vr_unindmap", oContainer);
            CopyObject(oMap, GetLocation(oContainer), oContainer, GetTag(oMap)+"3"+IntToString(nNumItems));
            DestroyObject(oMap);
            return;
        }else{ // 35th lvl map
            oMap = CreateItemOnObject("vr_unindmap", oContainer);
            CopyObject(oMap, GetLocation(oContainer), oContainer, GetTag(oMap)+"4"+IntToString(nNumItems));
            DestroyObject(oMap);
            return;
        }
        return;
    }
    return;
}
// ---------------------------------------------------------------
void CreateBottleInLoot(int nCR, object oContainer)
{
    // Simple Bottles
    if(d2()==1) CreateItemOnObject("vr_potion_simple_"+IntToString(Random(12)+1), oContainer);
    // Good Bottles
    if(d10()<=2) CreateItemOnObject("vr_potion_good_"+IntToString(Random(5)+1), oContainer);
    // Random Bottles
    if(d20()==1) CreateItemOnObject("vr_potion_random_"+IntToString(Random(14)+1), oContainer); 
    // Cure Bottles
    if(d10()<=2){
       int nRandom = Random(100);
       if(nCR<=5){
          if(nRandom<=80) CreateItemOnObject("vr_potion_cure_l_"+IntToString(Random(4)+1), oContainer);
          else CreateItemOnObject("vr_potion_cure_m_"+IntToString(Random(5)+1), oContainer);
       }else if(nCR<=10){
          if(nRandom<=20) CreateItemOnObject("vr_potion_cure_l_"+IntToString(Random(4)+1), oContainer);
          else if(nRandom<=90) CreateItemOnObject("vr_potion_cure_m_"+IntToString(Random(5)+1), oContainer);
          else CreateItemOnObject("vr_potion_cure_h_"+IntToString(Random(4)+1), oContainer);
       }else if(nCR<=15){
          if(nRandom<=5) CreateItemOnObject("vr_potion_cure_l_"+IntToString(Random(4)+1), oContainer);
          else if(nRandom<=70) CreateItemOnObject("vr_potion_cure_m_"+IntToString(Random(5)+1), oContainer);
          else if(nRandom<=98) CreateItemOnObject("vr_potion_cure_h_"+IntToString(Random(4)+1), oContainer);
          else CreateItemOnObject("vr_potion_cure_r_"+IntToString(Random(4)+1), oContainer);      
       }else if(nCR<=20){
          if(nRandom<=40) CreateItemOnObject("vr_potion_cure_m_"+IntToString(Random(5)+1), oContainer);
          else if(nRandom<=95) CreateItemOnObject("vr_potion_cure_h_"+IntToString(Random(4)+1), oContainer);
          else CreateItemOnObject("vr_potion_cure_r_"+IntToString(Random(4)+1), oContainer);
       }else{
          if(nRandom<=30) CreateItemOnObject("vr_potion_cure_m_"+IntToString(Random(5)+1), oContainer);
          else if(nRandom<=90) CreateItemOnObject("vr_potion_cure_h_"+IntToString(Random(4)+1), oContainer);
          else CreateItemOnObject("vr_potion_cure_r_"+IntToString(Random(4)+1), oContainer);
       }
    }
}
// ---------------------------------------------------------------
void CreateScrollInLoot(int nCR, object oContainer)
{
    int nChance;
    // lvl 0 scroll
    if(nCR==1){
       if(d4()==1) CreateItemOnObject("vr_scroll_lvl0_"+IntToString(Random(8)+1), oContainer);
    }else if(nCR==2){
       if(d10()==1) CreateItemOnObject("vr_scroll_lvl0_"+IntToString(Random(8)+1), oContainer);
    }
   
    // lvl 1 scroll
    nChance = 50;
    nChance = nChance - 2*(nCR-1);
    if(nChance<=10) nChance = 10;
    if(Random(100)<nChance) CreateItemOnObject("vr_scroll_lvl1_"+IntToString(Random(41)+1), oContainer);
   
    // lvl 2 scroll
    nChance = 45;
    if(nCR<3) nChance = nChance - 10*(3-nCR);
    else if(nCR>3){
       nChance = nChance - 2*(nCR-3);
       if(nChance<=10) nChance = 10;
    }
    if(Random(100)<nChance) CreateItemOnObject("vr_scroll_lvl2_"+IntToString(Random(45)+1), oContainer);
   
    // lvl 3 scroll
    nChance = 40;
    if(nCR<5) nChance = nChance - 8*(5-nCR);
    else if(nCR>5){
       nChance = nChance - 2*(nCR-5);
       if(nChance<=10) nChance = 10;
    }
    if(Random(100)<nChance) CreateItemOnObject("vr_scroll_lvl3_"+IntToString(Random(49)+1), oContainer);
   
    // lvl 4 scroll
    nChance = 35;
    if(nCR<7) nChance = nChance - 8*(7-nCR);
    else if(nCR>7){
       nChance = nChance - 2*(nCR-7);
       if(nChance<=8) nChance = 8;
    }
    if(Random(100)<nChance) CreateItemOnObject("vr_scroll_lvl4_"+IntToString(Random(34)+1), oContainer);         

    // lvl 5 scroll
    nChance = 30;
    if(nCR<9) nChance = nChance - 7*(9-nCR);
    else if(nCR>9){
       nChance = nChance - 2*(nCR-9);
       if(nChance<=8) nChance = 8;
    }
    if(Random(100)<nChance) CreateItemOnObject("vr_scroll_lvl5_"+IntToString(Random(29)+1), oContainer);   

    // lvl 6 scroll
    nChance = 25;
    if(nCR<11) nChance = nChance - 7*(11-nCR);
    else if(nCR>11){
       nChance = nChance - 2*(nCR-11);
       if(nChance<=8) nChance = 8;
    }
    if(Random(100)<nChance) CreateItemOnObject("vr_scroll_lvl6_"+IntToString(Random(34)+1), oContainer);

    // lvl 7 scroll
    nChance = 20;
    if(nCR<13) nChance = nChance - 6*(13-nCR);
    else if(nCR>13){
       nChance = nChance - 2*(nCR-13);
       if(nChance<=6) nChance = 6;
    }
    if(Random(100)<nChance) CreateItemOnObject("vr_scroll_lvl7_"+IntToString(Random(25)+1), oContainer);
   
    // lvl 8 scroll
    nChance = 15;
    if(nCR<15) nChance = nChance - 6*(15-nCR);
    else if(nCR>15){
       nChance = nChance - 2*(nCR-15);
       if(nChance<=6) nChance = 6;
    }
    if(Random(100)<nChance) CreateItemOnObject("vr_scroll_lvl8_"+IntToString(Random(21)+1), oContainer);   
   
    // lvl 9 scroll
    nChance = 10;
    if(nCR<17) nChance = nChance - 5*(17-nCR);
    else if(nCR>17){
       nChance = nChance - 2*(nCR-17);
       if(nChance<=6) nChance = 4;
    }
    if(Random(100)<nChance) CreateItemOnObject("vr_scroll_lvl9_"+IntToString(Random(20)+1), oContainer);         
}
// ---------------------------------------------------------------
void CreateMiscInLoot(int nCR, object oContainer)
{
    string sResRef;
    switch(Random(25)+1){
        case 1: sResRef = "mis_barskin"; break;
        case 2: sResRef = "mis_battletide"; break;
        case 3: sResRef = "mis_strength"; break;
        case 4: sResRef = "mis_clarity"; break;
        case 5: sResRef = "mis_dexterity"; break;
        case 6: sResRef = "mis_displacement"; break;
        case 7: sResRef = "mis_charisma"; break;
        case 8: sResRef = "mis_endurance"; break;
        case 9: sResRef = "mis_flame"; break;
        case 10: sResRef = "mis_intelligence"; break;
        case 11: sResRef = "mis_ghostly"; break;
        case 12: sResRef = "mis_magicwep"; break;
        case 13: sResRef = "mis_invissphere"; break;
        case 14: sResRef = "mis_haste"; break;
        case 15: sResRef = "mis_invisibility"; break;
        case 16: sResRef = "mis_keen"; break;
        case 17: sResRef = "mis_magearmor"; break;
        case 18: sResRef = "mis_wisdom"; break;
        case 19: sResRef = "mis_prayer"; break;
        case 20: sResRef = "mis_aliprotect"; break;
        case 21: sResRef = "mis_elemprotect"; break;
        case 22: sResRef = "mis_shield"; break;
        case 23: sResRef = "mis_ss"; break;
        case 24: sResRef = "mis_remblind"; break;
        case 25: sResRef = "mis_entropic"; break;
    }

    CreateItemOnObject(sResRef, oContainer);
}
// ---------------------------------------------------------------
void CreateRARInLoot(int nCR, object oContainer)
{
  CreateMiscInLoot(nCR, oContainer);
}
// ---------------------------------------------------------------
void CreateAmmoInLoot(int nCR, object oContainer)
{
    string sResRef;
    int nStackSize;
    int nMin, nRandom;

    if(nCR<5) return;
    if(nCR>=20){
        nMin=8;
        nRandom=16;
    }else{
        switch(nCR){
            case 5: nMin=1; nRandom=7; break;
            case 6: nMin=1; nRandom=7; break;
            case 7: nMin=1; nRandom=7; break;
            case 8: nMin=1; nRandom=7; break;
            case 9: nMin=1; nRandom=7; break;
            case 10: nMin=1; nRandom=10; break;
            case 11: nMin=1; nRandom=10; break;
            case 12: nMin=1; nRandom=10; break;
            case 13: nMin=6; nRandom=10; break;
            case 14: nMin=6; nRandom=10; break;
            case 15: nMin=6; nRandom=10; break;
            case 16: nMin=6; nRandom=16; break;
            case 17: nMin=6; nRandom=16; break;
            case 18: nMin=6; nRandom=16; break;
            case 19: nMin=6; nRandom=16; break;
        }
    }

    nRandom = nMin+Random(nRandom-nMin+1);
    switch(nRandom){
        case 1: sResRef="am_ar_1d10acid"; nStackSize=99; break;
        case 2: sResRef="am_ar_1d10cold"; nStackSize=99; break;
        case 3: sResRef="am_ar_1d10fire"; nStackSize=99; break;
        case 4: sResRef="am_ar_1d10elec"; nStackSize=99; break;
        case 5: sResRef="am_ar_1d10sonic"; nStackSize=99; break;
        case 6: sResRef="am_ar_1d10pierc"; nStackSize=66; break;
        case 7: sResRef="am_ar_1d10neg"; nStackSize=66; break;
        case 8: sResRef="am_ar_1d10div"; nStackSize=33; break;
        case 9: sResRef="am_ar_1d10magic"; nStackSize=33; break;
        case 10: sResRef="am_ar_1d10pos"; nStackSize=33; break;
        case 11: sResRef="am_ar_2d10acid"; nStackSize=66; break;
        case 12: sResRef="am_ar_2d10cold"; nStackSize=66; break;
        case 13: sResRef="am_ar_2d10fire"; nStackSize=66; break;
        case 14: sResRef="am_ar_2d10elec"; nStackSize=66; break;
        case 15: sResRef="am_ar_2d10sonic"; nStackSize=66; break;
        case 16: sResRef="am_ar_2d10neg"; nStackSize=33; break;
    }

    CreateItemOnObject(sResRef, oContainer, nStackSize);
}
// ---------------------------------------------------------------

// Creating item in loot.
// nType = 1:"belt", 2:"boots", 3:"cloak", 4:"gauntlet", 5:"ring", 6:"amulet", 7:"helmet",
//         8:"sling", 9:"dart", 10:"shuriken"
// nCR - mob's Chalendge Raiting
void CreateItemInLoot(int nType, int nCR, object oContainer)
{
    object oBaseItem, oItem; // Created Item
    int nAppNumber; // Appearance Number
    struct stItemProperty IPParam;
    int nRemainPoints = nCR;
    int nTableNumber;
    string sTag, sBaseItemTag;

    /* "*[quantity of sections]*_
            [groups_in_1st_section]:[1st_group_number]-[chance_to_be_choosed]%,
                                    [2nd_group_number]-[chance_to_be_choosed]%,
                                    [Nth_group_number]-[chance_to_be_choosed]%;
            [groups_in_2nd_section]: ... .*/

    string sGroupLine; // order of cheked group for every type of item.

    switch(nType){
        case 1: // BELT
                sBaseItemTag = "vr_belt"+IntToString(Random(18));
             oBaseItem = CreateItemOnObject(sBaseItemTag, oContainer);
                //SendMessageToPC(GetFirstPC(), "vr_belt");

                nAppNumber = Random(9)+1;
                sAppID = IntToString(nAppNumber);

                //oItem = CopyItemAndModify(oBaseItem, ITEM_APPR_TYPE_SIMPLE_MODEL, 0, nAppNumber);
             //DestroyObject(oBaseItem);
             oItem = oBaseItem;
            
                sGroupLine = "*2*_";
                           /*     stats  resist(simp&exotic) hp   */
                sGroupLine += "3:0009-040%,0601-040%,0017-020%;";
                           /*      AC       save(simp&univers)   skills    regen   */
                sGroupLine += "5:0004-050%,1101-022%,1102-005%,0010-017%,0007-016%.";
                break;

        case 2: ; // BOOTS
             sBaseItemTag = "vr_boots"+IntToString(Random(29));
                oBaseItem = CreateItemOnObject(sBaseItemTag, oContainer);
                //SendMessageToPC(GetFirstPC(), "vr_boots");

                nAppNumber = (Random(4)+1)*10+Random(3)+1;
                sAppID = IntToString(nAppNumber);

                //oItem = CopyItemAndModify(oBaseItem, ITEM_APPR_TYPE_SIMPLE_MODEL, 0, nAppNumber);
                //DestroyObject(oBaseItem);
             oItem = oBaseItem;

                sGroupLine = "*3*_";
                           /*      AC        stats   */
                sGroupLine += "2:0004-050%,0009-050%;";
                           /*    resist(simp&exotic) skills hp  */
                sGroupLine += "3:0601-030%,0010-050%,0017-020%;";
                //sGroupLine += "4:0601-020%,0602-010%,0005-030%,0010-040%;";
                           /*    regen     save(simp&univers)   */
                sGroupLine += "3:0007-050%,1101-035%,1102-015%.";
                break;

        case 3: // CLOAK
                sBaseItemTag = "vr_cloak"+IntToString(Random(22));
             oBaseItem = CreateItemOnObject(sBaseItemTag, oContainer);
                //SendMessageToPC(GetFirstPC(), "vr_cloak");

                nAppNumber = Random(14)+1;
                sAppID = IntToString(nAppNumber);

                //oItem = CopyItemAndModify(oBaseItem, ITEM_APPR_TYPE_SIMPLE_MODEL, 0, nAppNumber);
                //DestroyObject(oBaseItem);
             oItem = oBaseItem;

                sGroupLine = "*3*_";
                           /*      AC       save(simp&univers)  hp  */
                sGroupLine += "4:0004-035%,1101-025%,1102-010%,0017-030%;";
                           /*     skills    stats    */
                sGroupLine += "2:0010-050%,0009-050%;";
                           /*    resist(simp&exotic)   regen   */
                sGroupLine += "3:0601-040%,0007-030%,0016-030%.";
                //sGroupLine += "4:0005-025%,0601-017%,0602-008%,0007-025%.";

                break;
        case 4: // GAUNTLET/BRACERS
                switch(d2()){
                    case 1: sBaseItemTag = "vr_bracer"+IntToString(Random(11));
                      oBaseItem = CreateItemOnObject(sBaseItemTag, oContainer);
                            //SendMessageToPC(GetFirstPC(), "vr_bracer");
                            nAppNumber = Random(12)+1;
                            sAppID = IntToString(nAppNumber);

                            sGroupLine = "*3*_";
                                       /*     skills    AC   */
                            sGroupLine += "2:0010-070%,0004-030%;";
                                       /*    stats  resist(simp&exotic)   */
                            sGroupLine += "2:0009-050%,0601-050%;";
                            //sGroupLine += "4:0301-030%,0302-020%,0009-025%,0004-025%";
                                       /*    save(simp&univers)    regen     hp  */
                            sGroupLine += "4:1101-025%,1102-015%,0007-030%,0017-030%.";
                            //sGroupLine += "6:1101-017%,1102-008%,0007-025%,0601-015%,0602-008%,0005-025%.";
                            break;
                    case 2: sBaseItemTag = "vr_gauntlet"+IntToString(Random(32));
                      oBaseItem = CreateItemOnObject(sBaseItemTag, oContainer);
                            //SendMessageToPC(GetFirstPC(), "vr_gauntlet");
                            nAppNumber = Random(11)+1;
                            sAppID = IntToString(nAppNumber);

                            sGroupLine = "*3*_";
                                       /*     skills    attack   */
                            sGroupLine += "3:0010-030%,0002-035%,0016-035%;";
                                       /*    damage(simp&exotic)    stats       AC   */
                            sGroupLine += "3:0301-050%,0009-030%,0004-020%;";
//                            sGroupLine += "4:0301-030%,0302-020%,0009-025%,0004-025%";
                                       /*    save(simp&univers)    regen   resist(simp&exotic) */
                            sGroupLine += "4:1101-025%,1102-015%,0007-030%,0601-030%.";
                            //sGroupLine += "6:1101-017%,1102-008%,0007-025%,0601-015%,0602-008%,0005-025%.";

                            break;
                }
                //oItem = CopyItemAndModify(oBaseItem, ITEM_APPR_TYPE_SIMPLE_MODEL, 0, nAppNumber);
                //DestroyObject(oBaseItem);
             oItem = oBaseItem;
                break;

        case 5: // RING
             sBaseItemTag = "vr_ring"+IntToString(Random(38));
                oBaseItem = CreateItemOnObject(sBaseItemTag, oContainer);
                //SendMessageToPC(GetFirstPC(), "vr_ring");

                nAppNumber = Random(36)+1;
                sAppID = IntToString(nAppNumber);

                //oItem = CopyItemAndModify(oBaseItem, ITEM_APPR_TYPE_SIMPLE_MODEL, 0, nAppNumber);
                //DestroyObject(oBaseItem);
             oItem = oBaseItem;

                sGroupLine = "*2*_";
                           /*    save(simp&univers)     AC     resist(simp&exotic)   */
                sGroupLine += "4:1101-035%,1102-015%,0004-025%,0601-025%;";
                //sGroupLine += "5:1101-035%,1102-015%,0004-025%,0601-017%,0602-008%;";
                           /*     stats     skills     regen     hp  */
                sGroupLine += "4:0009-025%,0010-030%,0007-030%,0017-015%.";
                break;

        case 6: // AMULET
                sBaseItemTag = "vr_amulet"+IntToString(Random(26));
             oBaseItem = CreateItemOnObject(sBaseItemTag, oContainer);
                //SendMessageToPC(GetFirstPC(), "vr_amulet");

                nAppNumber = Random(28)+1;
                sAppID = IntToString(nAppNumber);

                //oItem = CopyItemAndModify(oBaseItem, ITEM_APPR_TYPE_SIMPLE_MODEL, 0, nAppNumber);
                //DestroyObject(oBaseItem);
             oItem = oBaseItem;

                sGroupLine = "*2*_";
                           /*    save(simp&univers)     AC     resist(simp&exotic)   */
                sGroupLine += "4:1101-035%,1102-015%,0004-025%,0601-025%;";
                //sGroupLine += "5:1101-035%,1102-015%,0004-025%,0601-017%,0602-008%;";
                           /*     stats     skills     regen   hp  */
                sGroupLine += "5:0009-020%,0010-020%,0007-020%,0016-020%,0017-020%.";
                break;

        case 7: // HELMET
                oItem = CreateBaseHelmetModel(oContainer);
                //SendMessageToPC(GetFirstPC(), "vr_helmet");
                sGroupLine = "*3*_";
                           /*      AC       skills    hp   */
                sGroupLine += "3:0004-040%,0010-040%,0017-020%;";
                           /*    resist(simp&exotic)  stats    */
                sGroupLine += "3:0601-040%,0009-030%,0016-030%;";
                //sGroupLine += "4:0005-034%,0601-022%,0602-011%,0009-033%;";
                           /*    save(simp&univers)    regen    */
                sGroupLine += "3:1101-035%,1102-015%,0007-050%.";
                break;

        case 8: // MAGIC ITEMS // OR WEAPON
                if (d3() != 3)
                {
                  oItem = CreateBaseWeaponModel(oContainer);
                  //SendMessageToPC(GetFirstPC(), "vr_weapon");
                  sGroupLine = "*3*_";
                             /*  enchncement  */
//                  sGroupLine += "1:0001-100%;";
                  sGroupLine += "1:0002-100%;";
                           /*   damage(simp&exotic)  */
//                sGroupLine += "2:0301-066%,0302-034%;";
                  sGroupLine += "1:0301-100%;";
                           /*   massiv crit, vamp reg, keen  */
                  sGroupLine += "3:0013-040%,0014-040%,0015-20%.";
                  break;
                }
                else
                {
                  oItem = CreateBaseStaffModel(oContainer);
                  //SendMessageToPC(GetFirstPC(), "vr_weapon");
                  sGroupLine = "*3*_";
                           /*     AC        stats    feats     */
                  sGroupLine += "3:0004-025%,0009-025%,0016-050%;";
                           /*   save(simp&universal)  skills   */
                  sGroupLine += "3:1101-035%,1102-015%,0010-050%;";
                           /*  damage reduct regen */
                  sGroupLine += "2:0601-050%,0007-050%.";
                  break;
                }

        case 9: // SHIELD
                switch(d3()){
                    case 1: sBaseItemTag = "vr_lshield"+IntToString(Random(16));
                      oBaseItem = CreateItemOnObject(sBaseItemTag, oContainer);
                            //SendMessageToPC(GetFirstPC(), "vr_lshield");
                            nAppNumber = (Random(4)+1)*10+Random(3)+1;
                            sAppID = IntToString(nAppNumber);
                            break;
                    case 2: sBaseItemTag = "vr_hshield"+IntToString(Random(12));
                      oBaseItem = CreateItemOnObject(sBaseItemTag, oContainer);
                            //SendMessageToPC(GetFirstPC(), "vr_hshield");
                            nAppNumber = (Random(4)+1)*10+Random(3)+1;
                            sAppID = IntToString(nAppNumber);
                            break;
                    case 3: sBaseItemTag = "vr_tshield"+IntToString(Random(18));
                      oBaseItem = CreateItemOnObject(sBaseItemTag, oContainer);
                            //SendMessageToPC(GetFirstPC(), "vr_tshield");
                            nAppNumber = (Random(4)+1)*10+Random(3)+1;
                            sAppID = IntToString(nAppNumber);
                            break;
                }
                //oItem = CopyItemAndModify(oBaseItem, ITEM_APPR_TYPE_SIMPLE_MODEL, 0, nAppNumber);
                //DestroyObject(oBaseItem);
             oItem = oBaseItem;

                sGroupLine = "*2*_";
                           /*      AC       resist(simp&exotic)   */
                sGroupLine += "3:0004-070%,0601-020%,0017-010%;";
                //sGroupLine += "3:0005-050%,0601-035%,0602-015%;";
                           /*    save(simp&univers)   stats     skills    */
                sGroupLine += "4:1101-022%,1102-011%,0009-034%,0010-033%.";
                break;

        case 10: // ARMOR
                oItem = CreateBaseArmorModel(oContainer);
                //SendMessageToPC(GetFirstPC(), "vr_armor");
                sGroupLine = "*3*_";
                           /*      AC     */
                sGroupLine += "1:0004-100%;";
                           /*    save(simp&univers)   stats     skills    */
                sGroupLine += "4:1101-022%,1102-011%,0009-034%,0010-033%;";
                           /*    resist(simp&exotic)   */
                sGroupLine += "2:0601-50%,0017-050%.";
                //sGroupLine += "3:0005-050%,0601-035%,0602-015%;";
                break;

        case 11: // RANGED WEAPONS
                oItem = CreateBaseRangedWeaponModel(oContainer);
                //SendMessageToPC(GetFirstPC(), "vr_weapon");
                sTag = GetTag(oItem);

//                if((GetBaseItemType(oItem)==BASE_ITEM_SHURIKEN)||(GetBaseItemType(oItem)==BASE_ITEM_DART)||(GetBaseItemType(oItem)==BASE_ITEM_THROWINGAXE))
                if((GetBaseItemType(oItem)==BASE_ITEM_DART)||(GetBaseItemType(oItem)==BASE_ITEM_THROWINGAXE))
                {
                    sGroupLine = "*2*_";
                               /*  attack  */
                    sGroupLine += "1:0002-100%;";
                               /*   damage(simp&exotic)  */
//                    sGroupLine += "2:0301-066%,0302-034%.";
                    sGroupLine += "1:0302-100%.";
                } else {
                    sGroupLine = "*3*_";
                               /*    attack    */
                    sGroupLine += "1:0002-100%;";
                               /*   mighty  */
                    sGroupLine += "1:0012-100%;";
                               /*  massiv crit  */
                    sGroupLine += "1:0014-100%.";
                }
                break;

        case 12: // WEAPONS
                oItem = CreateBaseWeaponModel(oContainer);
                //SendMessageToPC(GetFirstPC(), "vr_weapon");
                sGroupLine = "*3*_";
                           /*  enchncement  */
//                sGroupLine += "1:0001-100%;";
                sGroupLine += "1:0002-100%;";
                           /*   damage(simp&exotic)  */
//                sGroupLine += "2:0301-066%,0302-034%;";
                sGroupLine += "1:0301-100%;";
                           /*   massiv crit, vamp reg, keen  */
                sGroupLine += "3:0013-040%,0014-040%,0015-20%.";
                break;
    }

    int nSection; // [quantity of sections]
    int nGroup;   // [groups_in_Nth_section]
    int nTable;   // [Nth_group_number]
    int nPercent; // [chance_to_be_choosed]
    int i = 1; // SectionCount
    int j; // GroupCount
    int p = 1;
    int nLength = GetStringLength(sGroupLine);
    int nDice;
    int bSkip = FALSE;
    int nPrice;

    nSection = StringToInt(GetSubString(sGroupLine, 1, 1));
    nLength = nLength - 4;
    string sFullGroupLine = GetSubString(sGroupLine, 4, nLength);
    sGroupLine = sFullGroupLine;
    while((i<=nSection)&&(nRemainPoints>0)){
        nGroup = StringToInt(GetSubString(sGroupLine, 0, 1));
        nLength = nLength - 2;
        sGroupLine = GetSubString(sGroupLine, 2, nLength);
        nDice = d100();
        nPercent = 0;
        for(j=1; j<=nGroup; j++){
            nTable = StringToInt(GetSubString(sGroupLine, 0, 4));
            nPercent = nPercent + StringToInt(GetSubString(sGroupLine, 5, 3));
            nLength = nLength - 10;
            sGroupLine = GetSubString(sGroupLine, 10, nLength);
            if((nDice<=nPercent)&&!(bSkip)){
                if(i==1) {
                    nPrice = MyAddItemProperty(nTable, nCR, nRemainPoints, TRUE, oItem);
                    if(nPrice>0)
                        nRemainPoints = nRemainPoints - nPrice;
                } else {
                    nPrice = MyAddItemProperty(nTable, nCR, nRemainPoints, FALSE, oItem);
                    if(nPrice>0)
                        nRemainPoints = nRemainPoints - nPrice;
                }
                bSkip = TRUE;
            }
        }
        bSkip = FALSE;
        i++;
        if((i>nSection)&&(nRemainPoints>5)&&(p<=4)){
            i=1;
            sGroupLine = sFullGroupLine;
            p++;
            //SendMessageToPC(GetFirstPC(), GetName(oItem)+" "+IntToString(nRemainPoints));
        }
    }
    //SendMessageToPC(GetFirstPC(), "s1="+sCreatedItemTag);
    sCreatedItemTag = DecodeItemTag(sCreatedItemTag,0);
    //SendMessageToPC(GetFirstPC(), "s2="+sCreatedItemTag);
    switch(GetStringLength(sAppID)){
        case 1: sAppID = "S000000"+sAppID; break;
        case 2: sAppID = "S00000"+sAppID; break;
        case 3: sAppID = "S0000"+sAppID; break;
        case 4: sAppID = "S000"+sAppID; break;
        case 5: sAppID = "S00"+sAppID; break;
        case 6: sAppID = "S0"+sAppID; break;
        case 7: sAppID = "S"+sAppID; break;
        }
    sCreatedItemTag += sAppID;
    //SendMessageToPC(GetFirstPC(), "lootitemtag="+GetTag(oItem));
    if(GetIsItemPropertyValid(GetFirstItemProperty(oItem))){
       object oNewItem = CopyObject(oItem, GetLocation(oContainer), oContainer, sCreatedItemTag);
    }
    // --- for craft system ---
    //SetItemCharges(oNewItem, 1);

    //SendMessageToPC(GetFirstPC(), "name "+GetName(oNewItem));
    //SendMessageToPC(GetFirstPC(), "sAppID "+sAppID);
    //SendMessageToPC(GetFirstPC(), "sCreatedItemTag "+sCreatedItemTag);
    //SendMessageToPC(GetFirstPC(), "TAG "+GetTag(oNewItem));
    DestroyObject(oItem);
}

// ---------------------------------------------------------------

int MyAddItemProperty (int nTableNumber, int nCR, int nPoints, int bMainGroup, object oItem)
{
    int e = 0;
    struct stItemProperty IPParam = GetIPFromTable(nTableNumber, 0, 0, 0);
    int nN = IPParam.n; // quantity of IP in group
    int nSubGrp = IPParam.subgrp;
    string S = IPParam.s;
    int nSLength = GetStringLength(S);
    int nGC = IPParam.nGC; /* Group Coefficient, f.e. for enhancement nCG=5,
                              +1 enhancement for every 5 points of CR*/

    int nGM; /* Group Multiplier, f.e. for abilities nGM=6, because we have
                6 abilities to increase*/
// NOT USED

    if(bMainGroup){
     //  e = nCR/nGC; // find highest itemproperty fo current mob's CR
        e = nPoints/nGC;
       if(e>=nN) e=nN;
        switch(d4()){ // choosing number of itemproperty
            case 1: break;
            case 2: e=e-1; break;
            case 3: e=e-2; break;
            case 4: e=e-3; break;
        }
        if(e<0) e=0;
        // if((nGM>1)&(e>0)) e=nGM*(e-1)+Random(nGM)+1;
    }else{
        while(e<=(nSLength+1)/3){
            if(nPoints<StringToInt(GetSubString(S, e*3, 2))) break;
            e++;
        }
        if(e!=0) e = Random(e)/*+1*/;
    }
    if(e!=0 || (nTableNumber == 16 && bMainGroup)){
        IPParam = GetIPFromTable(nTableNumber, nSubGrp, e, GetBaseItemType(oItem));

        int nIPToAddType = GetItemPropertyType(IPParam.ip);
        int nIPToAddSubType = GetItemPropertySubType(IPParam.ip);
        int nIPType, nIPSubType;

        itemproperty ip = GetFirstItemProperty(oItem);
        nIPType = GetItemPropertyType(ip);
        nIPSubType = GetItemPropertySubType(ip);
        while(GetIsItemPropertyValid(ip)){
            if(nIPToAddType==nIPType){
                if(nIPToAddSubType==-1){
                    IPParam.price = -1;
                }else{
                    if(nIPToAddSubType==nIPSubType){
                        IPParam.price = -1;
                    }
                }
            }
            ip = GetNextItemProperty(oItem);
            nIPType = GetItemPropertyType(ip);
            nIPSubType = GetItemPropertySubType(ip);
        }

        if(IPParam.price>0){
            sCreatedItemTag += IntToString(nTableNumber)+"_"+
                               IntToString(nSubGrp)+"_"+
                               IntToString(e)+"x";
            AddItemProperty(DURATION_TYPE_PERMANENT, IPParam.ip, oItem);
        }
    }
    return IPParam.price;
}


скрипт второй...
в НВН2 мало используется, в нвн2 же на его функциях были завязаны изменения внешнего вида шмоток...
Neverwinter Script Source
// script for "RLS" (Random Loot System)
/* Scripted by Vanes */

object CreateBaseWeaponModel(object oContainer)
{
    object oItem;
    object oNewItem;
    int kTop, kMiddle, kBottom, kColor;
    int nRandom1 = Random(15)+1;
    //int nRandom2 = Random(4)+1;
    int nAppID;

    switch(nRandom1){ // Item Table
        case 1: oItem = CreateItemOnObject("vr_grtaxe"+IntToString(Random(14)), oContainer); // Great Axe
                kTop = 4; kMiddle = 4; kBottom = 4; kColor = 4; break;
        case 2: oItem = CreateItemOnObject("vr_waraxe"+IntToString(Random(6)), oContainer); // Dwarfen Waraxe
                kTop = 8; kMiddle = 6; kBottom = 6; kColor = 4; break;
        case 3: oItem = CreateItemOnObject("vr_btlaxe"+IntToString(Random(11)), oContainer); // Battle Axe
                kTop = 8; kMiddle = 6; kBottom = 6; kColor = 4; break;
        case 4: oItem = CreateItemOnObject("vr_bastard"+IntToString(Random(12)), oContainer);// Bastard Sword
                kTop = 6; kMiddle = 6; kBottom = 6; kColor = 4; break;
        case 5: oItem = CreateItemOnObject("vr_lngswrd"+IntToString(Random(15)), oContainer);// Long Sword
                kTop = 8; kMiddle = 8; kBottom = 8; kColor = 4; break;
        case 6: oItem = CreateItemOnObject("vr_katana"+IntToString(Random(12)), oContainer); // Katana
                kTop = 4; kMiddle = 4; kBottom = 4; kColor = 4; break;
        case 7: oItem = CreateItemOnObject("vr_rapier"+IntToString(Random(12)), oContainer);// Rapier
                kTop = 4; kMiddle = 4; kBottom = 4; kColor = 4; break;
        case 8: oItem = CreateItemOnObject("vr_scimitr"+IntToString(Random(12)), oContainer);// Scimitar
                kTop = 5; kMiddle = 5; kBottom = 5; kColor = 4; break;
        case 9: oItem = CreateItemOnObject("vr_whammer"+IntToString(Random(8)), oContainer);// Warhammer
                kTop = 6; kMiddle = 6; kBottom = 6; kColor = 4; break;
        case 10: oItem = CreateItemOnObject("vr_mrnstar"+IntToString(Random(10)), oContainer);// Morningstar
                kTop = 4; kMiddle = 4; kBottom = 4; kColor = 4; break;
        case 11: oItem = CreateItemOnObject("vr_scythe"+IntToString(Random(12)), oContainer);// Scythe
                kTop = 3; kMiddle = 3; kBottom = 3; kColor = 4; break;
        case 12: oItem = CreateItemOnObject("vr_kama"+IntToString(Random(11)), oContainer);  // Kama
                kTop = 1; kMiddle = 1; kBottom = 1; kColor = 4; break;
        case 13: oItem = CreateItemOnObject("vr_grtswrd"+IntToString(Random(13)), oContainer);// Greatsword
                kTop = 4; kMiddle = 4; kBottom = 4; kColor = 4; break;
        case 14: oItem = CreateItemOnObject("vr_kukri"+IntToString(Random(10)), oContainer);// Kukri
                kTop = 1; kMiddle = 1; kBottom = 1; kColor = 1; break;   
        case 15: oItem = CreateItemOnObject("vr_falchion"+IntToString(Random(7)), oContainer);// Falchion
                kTop = 1; kMiddle = 1; kBottom = 1; kColor = 1; break;                     
        /*case 20: oItem = CreateItemOnObject("vr_spear", oContainer); // Spear
                kTop = 4; kMiddle = 4; kBottom = 4; kColor = 4; break;
        case 11: oItem = CreateItemOnObject("vr_srtswrd", oContainer);// Short Sword
                kTop = 6; kMiddle = 6; kBottom = 6; kColor = 4; break;
        case 12: oItem = CreateItemOnObject("vr_club", oContainer);  // Club
                kTop = 4; kMiddle = 4; kBottom = 4; kColor = 4; break;
        case 14: oItem = CreateItemOnObject("vr_mace", oContainer);  // Mace
                kTop = 4; kMiddle = 4; kBottom = 4; kColor = 4; break;
        case 16: oItem = CreateItemOnObject("vr_qrtstff", oContainer);// Quarterstaff
                kTop = 4; kMiddle = 4; kBottom = 4; kColor = 4; break;
        case 18: oItem = CreateItemOnObject("vr_whip", oContainer);  // Whip
                kTop = 1; kMiddle = 1; kBottom = 1; kColor = 1; break;
        case 3: oItem = CreateItemOnObject("vr_hndaxe", oContainer); // Handaxe
                kTop = 4; kMiddle = 4; kBottom = 4; kColor = 4; break;
        case 14: oItem = CreateItemOnObject("vr_hflail", oContainer);// Heavy Flail
                kTop = 4; kMiddle = 4; kBottom = 4; kColor = 4; break;
        case 15: oItem = CreateItemOnObject("vr_lflail", oContainer);// Light Flail
                kTop = 4; kMiddle = 4; kBottom = 4; kColor = 4; break;
        case 16: oItem = CreateItemOnObject("vr_lhammer", oContainer);// Light Hammer
                kTop = 4; kMiddle = 4; kBottom = 4; kColor = 4; break;
        case 20: oItem = CreateItemOnObject("vr_dmace", oContainer); // Dire Mace
                kTop = 4; kMiddle = 4; kBottom = 4; kColor = 4; break;
        case 21: oItem = CreateItemOnObject("vr_daxe", oContainer);  // Dire Axe
                kTop = 3; kMiddle = 3; kBottom = 3; kColor = 4; break;
        case 23: oItem = CreateItemOnObject("vr_tbswrd", oContainer);// Two-Bladed Sword
                kTop = 3; kMiddle = 3; kBottom = 3; kColor = 4; break;
        case 25: oItem = CreateItemOnObject("vr_kukri", oContainer); // Kukri
                kTop = 1; kMiddle = 1; kBottom = 1; kColor = 4; break;
        case 26: oItem = CreateItemOnObject("vr_sickle", oContainer);// Sickle
                kTop = 1; kMiddle = 1; kBottom = 1; kColor = 4; break;
        case 28: oItem = CreateItemOnObject("vr_halberd", oContainer);// Halberd
                kTop = 4; kMiddle = 4; kBottom = 4; kColor = 4; break;
        */

    }
// ----- Modify Item's Model -----
   /* if(kTop!=0){   // not working with sling, dart and shuriken
            // changing model type
        nAppID = Random(kTop)+1;
        sAppID = IntToString(nAppID);
        oNewItem = CopyItemAndModify(oItem, ITEM_APPR_TYPE_WEAPON_MODEL,
              ITEM_APPR_WEAPON_MODEL_TOP, nAppID);
        DestroyObject(oItem);
        oItem = oNewItem;
        nAppID = Random(kMiddle)+1;
        sAppID += IntToString(nAppID);
        oNewItem = CopyItemAndModify(oItem, ITEM_APPR_TYPE_WEAPON_MODEL,
                ITEM_APPR_WEAPON_MODEL_MIDDLE, nAppID);
        DestroyObject(oItem);
        oItem = oNewItem;
        nAppID = Random(kBottom)+1;
        sAppID += IntToString(nAppID);
        oNewItem = CopyItemAndModify(oItem, ITEM_APPR_TYPE_WEAPON_MODEL,
                ITEM_APPR_WEAPON_MODEL_BOTTOM, nAppID);
        DestroyObject(oItem);
        oItem = oNewItem;
            // changing color
        nAppID = Random(kColor)+1;
        sAppID += IntToString(nAppID);
        oNewItem = CopyItemAndModify(oItem, ITEM_APPR_TYPE_WEAPON_COLOR,
              ITEM_APPR_WEAPON_MODEL_TOP, nAppID);
        DestroyObject(oItem);
        oItem = oNewItem;
        nAppID = Random(kColor)+1;
        sAppID += IntToString(nAppID);
        oNewItem = CopyItemAndModify(oItem, ITEM_APPR_TYPE_WEAPON_COLOR,
                ITEM_APPR_WEAPON_MODEL_MIDDLE, nAppID);
        DestroyObject(oItem);
        oItem = oNewItem;
        nAppID = Random(kColor)+1;
        sAppID += IntToString(nAppID);
        oNewItem = CopyItemAndModify(oItem, ITEM_APPR_TYPE_WEAPON_COLOR,
                ITEM_APPR_WEAPON_MODEL_BOTTOM, nAppID);
        DestroyObject(oItem);

        sAppID = "W0" + sAppID;
    }*/

    return oItem; //oNewItem;
}

// ---------------------------------------------------------------

object CreateBaseHelmetModel(object oContainer)
{
    object oItem, oNewItem;
    int nHelmType = Random (32) + 1;
    if(nHelmType<10) sAppID = "H00"+IntToString(nHelmType);
    else sAppID = "H0"+IntToString(nHelmType);
    int nHelmColor1 = Random (63);
    int nHelmColor2 = nHelmColor1;//Random (63);
    int nHelmColor3 = nHelmColor1;//Random (63);
    if(nHelmColor1<10) sAppID += "000"+IntToString(nHelmColor1);
    else sAppID += "00"+IntToString(nHelmColor1);

    oItem = CreateItemOnObject("vr_helmet"+IntToString(Random(47)), oContainer);
   
    /*oNewItem = CopyItemAndModify (oItem, ITEM_APPR_TYPE_ARMOR_MODEL, 0, nHelmType);
    DestroyObject (oItem);
    oItem = oNewItem;
    oNewItem = CopyItemAndModify (oItem, ITEM_APPR_TYPE_ARMOR_COLOR, ITEM_APPR_ARMOR_COLOR_METAL1, nHelmColor1);
    DestroyObject (oItem);
    oItem = oNewItem;
    oNewItem = CopyItemAndModify (oItem, ITEM_APPR_TYPE_ARMOR_COLOR, ITEM_APPR_ARMOR_COLOR_METAL2, nHelmColor2);
    DestroyObject (oItem);
    oItem = oNewItem;
    oNewItem = CopyItemAndModify (oItem, ITEM_APPR_TYPE_ARMOR_COLOR, ITEM_APPR_ARMOR_COLOR_CLOTH2, nHelmColor3);
    DestroyObject (oItem);*/

    return oItem; //oNewItem;
}

// ---------------------------------------------------------------

object CreateBaseArmorModel(object oContainer)
{
    object oItem, oNewItem;
    int nAppID;
    int nRandom1 = Random(11)+1;
    //int nRandom2 = Random(5)+1;
    switch(nRandom1){
        case 1: oItem = CreateItemOnObject("vr_0armor"+IntToString(Random(15)), oContainer); break;
       case 2: oItem = CreateItemOnObject("vr_0armor"+IntToString(Random(15)), oContainer); break;
       case 3: oItem = CreateItemOnObject("vr_0armor"+IntToString(Random(15)), oContainer); break;
        case 4: oItem = CreateItemOnObject("vr_1armor"+IntToString(Random(12)), oContainer); break;
        case 5: oItem = CreateItemOnObject("vr_2armor"+IntToString(Random(16)), oContainer); break;
        case 6: oItem = CreateItemOnObject("vr_3armor"+IntToString(Random(11)), oContainer); break;
        case 7: oItem = CreateItemOnObject("vr_4armor"+IntToString(Random(11)), oContainer); break;
        case 8: oItem = CreateItemOnObject("vr_5armor"+IntToString(Random(8)), oContainer); break;
        case 9: oItem = CreateItemOnObject("vr_6armor"+IntToString(Random(6)), oContainer); break;
       case 10: oItem = CreateItemOnObject("vr_7armor"+IntToString(Random(6)), oContainer); break;
       case 11: oItem = CreateItemOnObject("vr_8armor"+IntToString(Random(6)), oContainer); break;
    }
/*
    nAppID = Random(63)+1;
    if(nAppID<10) sAppID = "0";
    sAppID += IntToString(nAppID);
    oNewItem = CopyItemAndModify (oItem, ITEM_APPR_TYPE_ARMOR_COLOR, ITEM_APPR_ARMOR_COLOR_METAL1, nAppID);
    DestroyObject (oItem);
    oItem = oNewItem;
    oNewItem = CopyItemAndModify (oItem, ITEM_APPR_TYPE_ARMOR_COLOR, ITEM_APPR_ARMOR_COLOR_METAL2, nAppID);
    DestroyObject (oItem);
    oItem = oNewItem;
    nAppID = Random(63)+1;
    if(nAppID<10) sAppID += "0";
    sAppID += IntToString(nAppID);
    oNewItem = CopyItemAndModify (oItem, ITEM_APPR_TYPE_ARMOR_COLOR, ITEM_APPR_ARMOR_COLOR_CLOTH1, nAppID);
    DestroyObject (oItem);
    oItem = oNewItem;
    oNewItem = CopyItemAndModify (oItem, ITEM_APPR_TYPE_ARMOR_COLOR, ITEM_APPR_ARMOR_COLOR_CLOTH1, nAppID);
    DestroyObject (oItem);
    oItem = oNewItem;
    nAppID = Random(63)+1;
    if(nAppID<10) sAppID += "0";
    sAppID += IntToString(nAppID);
    oNewItem = CopyItemAndModify (oItem, ITEM_APPR_TYPE_ARMOR_COLOR, ITEM_APPR_ARMOR_COLOR_LEATHER1, nAppID);
    DestroyObject (oItem);
    oItem = oNewItem;
    oNewItem = CopyItemAndModify (oItem, ITEM_APPR_TYPE_ARMOR_COLOR, ITEM_APPR_ARMOR_COLOR_LEATHER2, nAppID);
    DestroyObject (oItem);
    sAppID = "A0"+sAppID;*/

    return oItem;//oNewItem;
}

object CreateBaseRangedWeaponModel(object oContainer)
{
    object oItem;
    object oNewItem;
    int kTop, kMiddle, kBottom, kColor;
    int nRandom = Random(3)+1;
    int nAppID;

    switch(nRandom){ // Item Table
        case 1: oItem = CreateItemOnObject("vr_lngbow"+IntToString(Random(13)), oContainer); // Longbow
                kTop = 8; kMiddle = 8; kBottom = 8; kColor = 4; break;
        case 2: oItem = CreateItemOnObject("vr_srtbow"+IntToString(Random(11)), oContainer);// Shortbow
                kTop = 6; kMiddle = 6; kBottom = 6; kColor = 4; break;
        case 3: oItem = CreateItemOnObject("vr_lngbow"+IntToString(Random(13)), oContainer); // Longbow
                kTop = 8; kMiddle = 8; kBottom = 8; kColor = 4; break;
/*
        case 1: oItem = CreateItemOnObject("vr_hcrsbow", oContainer);// Heavy Crossbow
                kTop = 4; kMiddle = 4; kBottom = 4; kColor = 4; break;
        case 5: oItem = CreateItemOnObject("vr_dart", oContainer, 50);  // Dart
                kTop = 0; kMiddle = 0; kBottom = 0; kColor = 4; break;
        case 4: oItem = CreateItemOnObject("vr_thraxe", oContainer, 50);// Throwing Axe
                kTop = 4; kMiddle = 4; kBottom = 4; kColor = 4; break;
        case 5: oItem = CreateItemOnObject("vr_lcrsbow", oContainer);// Light Crossbow
                kTop = 4; kMiddle = 4; kBottom = 4; kColor = 4; break;
        case 6: oItem = CreateItemOnObject("vr_sling", oContainer); // Sling
                kTop = 0; kMiddle = 0; kBottom = 0; kColor = 4; break;
        case 7: oItem = CreateItemOnObject("vr_dart", oContainer, 50);  // Dart
                kTop = 0; kMiddle = 0; kBottom = 0; kColor = 4; break;
        case 8: oItem = CreateItemOnObject("vr_shrken", oContainer, 50);//Shuriken
                kTop = 0; kMiddle = 0; kBottom = 0; kColor = 4; break;*/

    }

// ----- Modify Item's with Simple Model (sling, dart, suriken) -----
    /*if(nRandom==5){ // sling
        nAppID =  (Random(4)+1)*10+Random(4)+1;
        sAppID = IntToString(nAppID);
        oNewItem = CopyItemAndModify(oItem, ITEM_APPR_TYPE_SIMPLE_MODEL, 0, nAppID);
        DestroyObject(oItem);
        return oNewItem;
    }
    if(nRandom==6){ // dart
        nAppID = (Random(4)+1)*10+Random(3)+1;
        sAppID = IntToString(nAppID);
        oNewItem = CopyItemAndModify(oItem, ITEM_APPR_TYPE_SIMPLE_MODEL, 0, nAppID);
        DestroyObject(oItem);
        return oNewItem;
    }
    if(nRandom==7){ // shuriken
        nAppID = (Random(4)+1)*10+Random(3)+1;
        sAppID = IntToString(nAppID);
        oNewItem = CopyItemAndModify(oItem, ITEM_APPR_TYPE_SIMPLE_MODEL, 0, nAppID);
        DestroyObject(oItem);
        return oNewItem;
    }*/


// ----- Modify Item's Model -----
/*   if(kTop!=0){   // not working with sling, dart and shuriken
            // changing model type
        nAppID = Random(kTop)+1;
        sAppID = IntToString(nAppID);
        oNewItem = CopyItemAndModify(oItem, ITEM_APPR_TYPE_WEAPON_MODEL,
              ITEM_APPR_WEAPON_MODEL_TOP, nAppID);
        DestroyObject(oItem);
        oItem = oNewItem;
        nAppID = Random(kMiddle)+1;
        sAppID += IntToString(nAppID);
        oNewItem = CopyItemAndModify(oItem, ITEM_APPR_TYPE_WEAPON_MODEL,
                ITEM_APPR_WEAPON_MODEL_MIDDLE, nAppID);
        DestroyObject(oItem);
        oItem = oNewItem;
        nAppID = Random(kBottom)+1;
        sAppID += IntToString(nAppID);
        oNewItem = CopyItemAndModify(oItem, ITEM_APPR_TYPE_WEAPON_MODEL,
                ITEM_APPR_WEAPON_MODEL_BOTTOM, nAppID);
        DestroyObject(oItem);
        oItem = oNewItem;
            // changing color
        nAppID = Random(kColor)+1;
        sAppID += IntToString(nAppID);
        oNewItem = CopyItemAndModify(oItem, ITEM_APPR_TYPE_WEAPON_COLOR,
              ITEM_APPR_WEAPON_MODEL_TOP, nAppID);
        DestroyObject(oItem);
        oItem = oNewItem;
        nAppID = Random(kColor)+1;
        sAppID += IntToString(nAppID);
        oNewItem = CopyItemAndModify(oItem, ITEM_APPR_TYPE_WEAPON_COLOR,
                ITEM_APPR_WEAPON_MODEL_MIDDLE, nAppID);
        DestroyObject(oItem);
        oItem = oNewItem;
        nAppID = Random(kColor)+1;
        sAppID += IntToString(nAppID);
        oNewItem = CopyItemAndModify(oItem, ITEM_APPR_TYPE_WEAPON_COLOR,
                ITEM_APPR_WEAPON_MODEL_BOTTOM, nAppID);
        DestroyObject(oItem);

        sAppID = "W0" + sAppID;
    }
    else
    {
      sAppID = "W0000000";
    }*/

    return oItem;//oNewItem;
}

object CreateBaseStaffModel(object oContainer)
{
    object oItem = CreateItemOnObject("vr_staff", oContainer);;
    object oNewItem;
    int kTop = 6, kMiddle = 6, kBottom = 6, kColor = 6;
    int nAppID;

// ----- Modify Item's Model -----
        nAppID = Random(kTop)+1;
        sAppID = IntToString(nAppID);
        oNewItem = CopyItemAndModify(oItem, ITEM_APPR_TYPE_WEAPON_MODEL,
              ITEM_APPR_WEAPON_MODEL_TOP, nAppID);
        DestroyObject(oItem);
        oItem = oNewItem;
        nAppID = Random(kMiddle)+1;
        sAppID += IntToString(nAppID);
        oNewItem = CopyItemAndModify(oItem, ITEM_APPR_TYPE_WEAPON_MODEL,
                ITEM_APPR_WEAPON_MODEL_MIDDLE, nAppID);
        DestroyObject(oItem);
        oItem = oNewItem;
        nAppID = Random(kBottom)+1;
        sAppID += IntToString(nAppID);
        oNewItem = CopyItemAndModify(oItem, ITEM_APPR_TYPE_WEAPON_MODEL,
                ITEM_APPR_WEAPON_MODEL_BOTTOM, nAppID);
        DestroyObject(oItem);
        oItem = oNewItem;
            // changing color
        nAppID = Random(kColor)+1;
        sAppID += IntToString(nAppID);
        oNewItem = CopyItemAndModify(oItem, ITEM_APPR_TYPE_WEAPON_COLOR,
              ITEM_APPR_WEAPON_MODEL_TOP, nAppID);
        DestroyObject(oItem);
        oItem = oNewItem;
        nAppID = Random(kColor)+1;
        sAppID += IntToString(nAppID);
        oNewItem = CopyItemAndModify(oItem, ITEM_APPR_TYPE_WEAPON_COLOR,
                ITEM_APPR_WEAPON_MODEL_MIDDLE, nAppID);
        DestroyObject(oItem);
        oItem = oNewItem;
        nAppID = Random(kColor)+1;
        sAppID += IntToString(nAppID);
        oNewItem = CopyItemAndModify(oItem, ITEM_APPR_TYPE_WEAPON_COLOR,
                ITEM_APPR_WEAPON_MODEL_BOTTOM, nAppID);
        DestroyObject(oItem);

        sAppID = "W0" + sAppID;
    return oNewItem;
}


третий скрипт - таблица св-в, которые могут быть добавлены на шмотки...
Neverwinter Script Source
// script for "RLS" (Random Loot System)
/* Scripted by Vanes */

// Return Item Property and its price.
struct stItemProperty GetIPFromTable (int nGroupNumber, int nSubGrp, int nIPNumber, int nBaseItemType)
{
    int nRandomInGroup;

    struct stItemProperty IPParam;
    int n;
    itemproperty ip;
    int nPrice;
    string s;
    int nGC; /* Group Coefficient, f.e. for enhancement nCG=5,
                +1 enhancement for every 5 points of CR*/

    int nGM; /* Group Multiplier, f.e. for abilities nGM=6, because we have
                6 abilities to increase*/
//NOT USED

    switch(nGroupNumber){
        /*
        case 1: // ----- ENHANCEMENT BONUS TABLE -----
            n = 7; // don't forget to change this variable, then adding new IP in table
            s = "05_10_15_20_25_30_35"; //how much IP costs
            nGC = 5;  // Group Coefficient
            nGM = 1;  // Group Multiplier
            nSubGrp = 0;
            switch(nIPNumber){
                case 1: ip=ItemPropertyEnhancementBonus(1); nPrice=3; break;
                case 2: ip=ItemPropertyEnhancementBonus(2); nPrice=4; break;
                case 3: ip=ItemPropertyEnhancementBonus(3); nPrice=5; break;
                case 4: ip=ItemPropertyEnhancementBonus(4); nPrice=6; break;
                case 5: ip=ItemPropertyEnhancementBonus(5); nPrice=7; break;
                case 6: ip=ItemPropertyEnhancementBonus(6); nPrice=8; break;
                case 7: ip=ItemPropertyEnhancementBonus(7); nPrice=9; break;
            }
            break;
        */

        case 2: // ----- ATTACK BONUS TABLE
            n = 7; // don't forget to change this variable, then adding new IP in table
            s = "03_06_09_12_15_18_21"; //how much IP costs
            nGC = 5// Group Coefficient
            nGM = 1// Group Multiplier
            nSubGrp = 0;
            switch(nIPNumber){
                case 1: ip=ItemPropertyAttackBonus(1); nPrice=3; break;
                case 2: ip=ItemPropertyAttackBonus(2); nPrice=6; break;
                case 3: ip=ItemPropertyAttackBonus(3); nPrice=9; break;
                case 4: ip=ItemPropertyAttackBonus(4); nPrice=12; break;
                case 5: ip=ItemPropertyAttackBonus(5); nPrice=15; break;
                case 6: ip=ItemPropertyAttackBonus(6); nPrice=18; break;
                case 7: ip=ItemPropertyAttackBonus(7); nPrice=21; break;
            }
            break;

        case 301: // ----- DAMAGE BONUS TABLE (SIMPLE)----- CANN'T BE USED AS MAIN GROUP
            n = 7; // don't forget to change this variable, then adding new IP in table
//            s = "02_03_04_05_06_07"; //how much IP costs
            s = "01_02_03_04_05_06_07"; //how much IP costs
            nGC = 1// Group Coefficient
            nGM = 1// Group Multiplier
            if(nSubGrp==0) nSubGrp=Random(5)+1;
            switch(nSubGrp){
                case 1: nRandomInGroup = IP_CONST_DAMAGETYPE_ACID; break;
                case 2: nRandomInGroup = IP_CONST_DAMAGETYPE_COLD; break;
                case 3: nRandomInGroup = IP_CONST_DAMAGETYPE_ELECTRICAL; break;
                case 4: nRandomInGroup = IP_CONST_DAMAGETYPE_FIRE; break;
                case 5: nRandomInGroup = IP_CONST_DAMAGETYPE_SONIC; break;
                /*
                case 6:
                {
                  int nDT = StringToInt(Get2DAString("baseitems", "WeaponType", nBaseItemType));
                  nRandomInGroup = IP_CONST_DAMAGETYPE_SLASHING;
                  if (nDT == 1) nRandomInGroup = IP_CONST_DAMAGETYPE_PIERCING;
                  if (nDT == 2) nRandomInGroup = IP_CONST_DAMAGETYPE_BLUDGEONING;
                  break;
                }
                case 6: nRandomInGroup = IP_CONST_DAMAGETYPE_BLUDGEONING; break;
                case 7: nRandomInGroup = IP_CONST_DAMAGETYPE_PIERCING; break;
                case 8: nRandomInGroup = IP_CONST_DAMAGETYPE_SLASHING; break;
                */

            }
            switch(nIPNumber){
                case 1: ip=ItemPropertyDamageBonus(nRandomInGroup,IP_CONST_DAMAGEBONUS_2);
                        nPrice=1; break;
                case 2: ip=ItemPropertyDamageBonus(nRandomInGroup,IP_CONST_DAMAGEBONUS_1d4);
                        nPrice=2; break;
                case 3: ip=ItemPropertyDamageBonus(nRandomInGroup,IP_CONST_DAMAGEBONUS_1d6);
                        nPrice=3; break;
                case 4: ip=ItemPropertyDamageBonus(nRandomInGroup,IP_CONST_DAMAGEBONUS_1d8);
                        nPrice=4; break;
                case 5: ip=ItemPropertyDamageBonus(nRandomInGroup,IP_CONST_DAMAGEBONUS_5);
                        nPrice=5; break;
                case 6: ip=ItemPropertyDamageBonus(nRandomInGroup,IP_CONST_DAMAGEBONUS_1d10);
                        nPrice=6; break;
                case 7: ip=ItemPropertyDamageBonus(nRandomInGroup,IP_CONST_DAMAGEBONUS_7);
                        nPrice=7; break;
            }
            break;

        case 302: // ----- DAMAGE BONUS TABLE (EXOTIC)----- CANN'T BE USED AS MAIN GROUP
            n = 6; // don't forget to change this variable, then adding new IP in table
            s = "03_04_05_06_07_08"; //how much IP costs
            nGC = 1// Group Coefficient
            nGM = 1// Group Multiplier
            if(nSubGrp==0) nSubGrp=d4();
            switch(nSubGrp){
                case 1: nRandomInGroup = IP_CONST_DAMAGETYPE_DIVINE; break;
                case 2: nRandomInGroup = IP_CONST_DAMAGETYPE_POSITIVE; break;
                case 3: nRandomInGroup = IP_CONST_DAMAGETYPE_NEGATIVE; break;
                case 4: nRandomInGroup = IP_CONST_DAMAGETYPE_MAGICAL; break;
            }
            switch(nIPNumber){
                case 1: ip=ItemPropertyDamageBonus(nRandomInGroup,IP_CONST_DAMAGEBONUS_2);
                        nPrice=3; break;
                case 2: ip=ItemPropertyDamageBonus(nRandomInGroup,IP_CONST_DAMAGEBONUS_1d4);
                        nPrice=4; break;
                case 3: ip=ItemPropertyDamageBonus(nRandomInGroup,IP_CONST_DAMAGEBONUS_1d6);
                        nPrice=5; break;
                case 4: ip=ItemPropertyDamageBonus(nRandomInGroup,IP_CONST_DAMAGEBONUS_1d8);
                        nPrice=6; break;
                case 5: ip=ItemPropertyDamageBonus(nRandomInGroup,IP_CONST_DAMAGEBONUS_5);
                        nPrice=7; break;
                case 6: ip=ItemPropertyDamageBonus(nRandomInGroup,IP_CONST_DAMAGEBONUS_1d10);
                        nPrice=8; break;
            }
            break;

        case 4: // ----- AC BONUS TABLE -----
            n = 6; // don't forget to change this variable, then adding new IP in table
            s = "03_06_09_12_15_18"; //how much IP costs
            nGC = 3// Group Coefficient
            nGM = 1// Group Multiplier
            nSubGrp=0;
            switch(nIPNumber){
                case 1: ip=ItemPropertyACBonus(1); nPrice=3; break;
                case 2: ip=ItemPropertyACBonus(2); nPrice=6; break;
                case 3: ip=ItemPropertyACBonus(3); nPrice=9; break;
                case 4: ip=ItemPropertyACBonus(4); nPrice=12; break;
                case 5: ip=ItemPropertyACBonus(5); nPrice=15; break;
                case 6: ip=ItemPropertyACBonus(6); nPrice=18; break;
                //case 7: ip=ItemPropertyACBonus(7); nPrice=35; break;
            }
            break;
        /*
        case 5: // ----- DAMAGE REDUCTION TABLE ----- CANN'T BE USED AS MAIN GROUP
            n = 7; // don't forget to change this variable, then adding new IP in table
            s = "03_06_09_12_15_18_21"; //how much IP costs
            nGC = 1;  // Group Coefficient
            nGM = 1;  // Group Multiplier
            nSubGrp=0;
            switch(nIPNumber){
                case 1: nRandomInGroup = IP_CONST_DAMAGEREDUCTION_1; nPrice=3; break;
                case 2: nRandomInGroup = IP_CONST_DAMAGEREDUCTION_2; nPrice=6; break;
                case 3: nRandomInGroup = IP_CONST_DAMAGEREDUCTION_3; nPrice=9; break;
                case 4: nRandomInGroup = IP_CONST_DAMAGEREDUCTION_4; nPrice=12; break;
                case 5: nRandomInGroup = IP_CONST_DAMAGEREDUCTION_5; nPrice=15; break;
                case 6: nRandomInGroup = IP_CONST_DAMAGEREDUCTION_6; nPrice=18; break;
                case 7: nRandomInGroup = IP_CONST_DAMAGEREDUCTION_7; nPrice=21; break;
            }
            ip = ItemPropertyDamageReduction(nRandomInGroup, IP_CONST_DAMAGESOAK_5_HP);
            break;
        */

        case 601: // ----- DAMAGE RESIST TABLE (SIMPLE)----- CANN'T BE USED AS MAIN GROUP
            n = 5; // don't forget to change this variable, then adding new IP in table
            s = "03_06_09_12_15"; //how much IP costs
            nGC = 3// Group Coefficient
            nGM = 1// Group Multiplier
            if(nSubGrp==0) nSubGrp=Random(5)+1;
            switch(nSubGrp){
                case 1: nRandomInGroup = IP_CONST_DAMAGETYPE_ACID; break;
                case 2: nRandomInGroup = IP_CONST_DAMAGETYPE_COLD; break;
                case 3: nRandomInGroup = IP_CONST_DAMAGETYPE_ELECTRICAL; break;
                case 4: nRandomInGroup = IP_CONST_DAMAGETYPE_FIRE; break;
                case 5: nRandomInGroup = IP_CONST_DAMAGETYPE_SONIC; break;
                ///case 6: nRandomInGroup = IP_CONST_DAMAGETYPE_BLUDGEONING; break;
                ///case 7: nRandomInGroup = IP_CONST_DAMAGETYPE_PIERCING; break;
                ///case 8: nRandomInGroup = IP_CONST_DAMAGETYPE_SLASHING; break;
            }
            switch(nIPNumber){
                case 1: ip=ItemPropertyDamageResistance(nRandomInGroup,IP_CONST_DAMAGERESIST_5);
                        nPrice = 3; break;
                case 2: ip=ItemPropertyDamageResistance(nRandomInGroup,IP_CONST_DAMAGERESIST_10);
                        nPrice = 6; break;
                case 3: ip=ItemPropertyDamageResistance(nRandomInGroup,IP_CONST_DAMAGERESIST_15);
                        nPrice = 9; break;
                case 4: ip=ItemPropertyDamageResistance(nRandomInGroup,IP_CONST_DAMAGERESIST_20);
                        nPrice = 12; break;
                case 5: ip=ItemPropertyDamageResistance(nRandomInGroup,IP_CONST_DAMAGERESIST_25);
                        nPrice = 15; break;
            }
            break;
        /*
        case 602: // ----- DAMAGE RESIST TABLE (EXOTIC)----- CANN'T BE USED AS MAIN GROUP
            n = 1; // don't forget to change this variable, then adding new IP in table
            s = "08"; //how much IP costs
            nGC = 1;  // Group Coefficient
            nGM = 1;  // Group Multiplier
            if(nSubGrp==0) nSubGrp=d4();
            switch(nSubGrp){
                case 1: nRandomInGroup = IP_CONST_DAMAGETYPE_DIVINE; break;
                case 2: nRandomInGroup = IP_CONST_DAMAGETYPE_POSITIVE; break;
                case 3: nRandomInGroup = IP_CONST_DAMAGETYPE_NEGATIVE; break;
                case 4: nRandomInGroup = IP_CONST_DAMAGETYPE_MAGICAL; break;
            }
            nIPNumber = 1;
            ip=ItemPropertyDamageResistance(nRandomInGroup,IP_CONST_DAMAGERESIST_5);
            nPrice = 8;
            break;
        */

        case 7: // ----- REGENERATION TABLE ----- CANN'T BE USED AS MAIN GROUP
            n = 5; // don't forget to change this variable, then adding new IP in table
            s = "04_08_12_16_20"; //how much IP costs
            nGC = 4// Group Coefficient
            nGM = 1// Group Multiplier
            nSubGrp=0;
            switch(nIPNumber){
                case 1: ip=ItemPropertyRegeneration(1); nPrice=4; break;
                case 2: ip=ItemPropertyRegeneration(2); nPrice=8; break;
                case 3: ip=ItemPropertyRegeneration(3); nPrice=12; break;
                case 4: ip=ItemPropertyRegeneration(4); nPrice=16; break;
                case 5: ip=ItemPropertyRegeneration(5); nPrice=20; break;
            }
            break;

        case 8: // ----- WEIGHT REDUCTION TABLE ----- CANN'T BE USED AS MAIN GROUP
            n = 4; // don't forget to change this variable, then adding new IP in table
            s = "02_04_06_08"; //how much IP costs
            nGC = 2// Group Coefficient
            nGM = 1// Group Multiplier
            nSubGrp=0;
            switch(nIPNumber){
                case 1: nRandomInGroup = IP_CONST_REDUCEDWEIGHT_20_PERCENT; nPrice=2; break;
                case 2: nRandomInGroup = IP_CONST_REDUCEDWEIGHT_40_PERCENT; nPrice=4; break;
                case 3: nRandomInGroup = IP_CONST_REDUCEDWEIGHT_60_PERCENT; nPrice=6; break;
                case 4: nRandomInGroup = IP_CONST_REDUCEDWEIGHT_80_PERCENT; nPrice=8; break;
            }
            ip = ItemPropertyWeightReduction(nRandomInGroup);
            break;

        case 9: // ----- ABILITY BONUS TABLE -----
            n = 6; // don't forget to change this variable, then adding new IP in table
            s = "02_04_06_08_10_12"; //how much IP costs
            nGC = 2// Group Coefficient
            nGM = 1// Group Multiplier
            if(nSubGrp==0) nSubGrp=d6();
            switch(nSubGrp){
                case 1: nRandomInGroup = IP_CONST_ABILITY_CHA; break;
                case 2: nRandomInGroup = IP_CONST_ABILITY_CON; break;
                case 3: nRandomInGroup = IP_CONST_ABILITY_DEX; break;
                case 4: nRandomInGroup = IP_CONST_ABILITY_INT; break;
                case 5: nRandomInGroup = IP_CONST_ABILITY_STR; break;
                case 6: nRandomInGroup = IP_CONST_ABILITY_WIS; break;
            }
            switch(nIPNumber){
                case 1: ip=ItemPropertyAbilityBonus(nRandomInGroup, 1); nPrice=2; break;
                case 2: ip=ItemPropertyAbilityBonus(nRandomInGroup, 2); nPrice=4; break;
                case 3: ip=ItemPropertyAbilityBonus(nRandomInGroup, 3); nPrice=6; break;
                case 4: ip=ItemPropertyAbilityBonus(nRandomInGroup, 4); nPrice=8; break;
                case 5: ip=ItemPropertyAbilityBonus(nRandomInGroup, 5); nPrice=10; break;
                case 6: ip=ItemPropertyAbilityBonus(nRandomInGroup, 6); nPrice=12; break;
            }
            break;

        case 10: // ----- SKILL BONUS TABLE (SIMPLE)----- CANN'T BE USED AS MAIN GROUP
            n = 3; // don't forget to change this variable, then adding new IP in table
            s = "02_04_06"; //how much IP costs
            nGC = 2// Group Coefficient
            nGM = 1// Group Multiplier
            if(nSubGrp==0) nSubGrp=Random(10)+1;
            switch(nSubGrp){
                case 1: nRandomInGroup = SKILL_HIDE; break;
                case 2: nRandomInGroup = SKILL_MOVE_SILENTLY; break;
                case 3: nRandomInGroup = SKILL_SPOT; break;
                case 4: nRandomInGroup = SKILL_LISTEN; break;
                //case 5: nRandomInGroup = SKILL_DISCIPLINE; break;
                case 5: nRandomInGroup = SKILL_PARRY; break;
             case 6: nRandomInGroup = SKILL_CONCENTRATION; break;
                case 7: nRandomInGroup = SKILL_HEAL; break;
                case 8: nRandomInGroup = SKILL_TUMBLE; break;
                case 9: nRandomInGroup = SKILL_SPELLCRAFT; break;
                case 10: nRandomInGroup = SKILL_TAUNT; break;
            }
            switch(nIPNumber){
                case 1: ip=ItemPropertySkillBonus(nRandomInGroup, 4); nPrice=2; break;
                case 2: ip=ItemPropertySkillBonus(nRandomInGroup, 8); nPrice=4; break;
                case 3: ip=ItemPropertySkillBonus(nRandomInGroup, 12); nPrice=6; break;
            }
            break;

        case 1101: // ----- SAVING THROW TABLE (SIMPLE)-----
            n = 5; // don't forget to change this variable, then adding new IP in table
            s = "02_04_06_08_10"; //how much IP costs
            nGC = 2// Group Coefficient
            nGM = 1// Group Multiplier
            if(nSubGrp==0) nSubGrp=d3();
            switch(nSubGrp){
                case 1: nRandomInGroup = IP_CONST_SAVEBASETYPE_FORTITUDE; break;
                case 2: nRandomInGroup = IP_CONST_SAVEBASETYPE_REFLEX; break;
                case 3: nRandomInGroup = IP_CONST_SAVEBASETYPE_WILL; break;

            }
            switch(nIPNumber){
                case 1: ip=ItemPropertyBonusSavingThrow(nRandomInGroup, 1); nPrice=2; break;
                case 2: ip=ItemPropertyBonusSavingThrow(nRandomInGroup, 2); nPrice=4; break;
                case 3: ip=ItemPropertyBonusSavingThrow(nRandomInGroup, 3); nPrice=6; break;
                case 4: ip=ItemPropertyBonusSavingThrow(nRandomInGroup, 4); nPrice=8; break;
                case 5: ip=ItemPropertyBonusSavingThrow(nRandomInGroup, 5); nPrice=10; break;
            }
            break;

        case 1102: // ----- SAVING THROW TABLE (UNIVERSAL)-----
            n = 3; // don't forget to change this variable, then adding new IP in table
            s = "02_07_12"; //how much IP costs
            nGC = 5// Group Coefficient
            nGM = 1// Group Multiplier
            nSubGrp = 0;
            nRandomInGroup = IP_CONST_SAVEVS_UNIVERSAL;
            switch(nIPNumber){
                case 1: ip=ItemPropertyBonusSavingThrowVsX(nRandomInGroup, 1); nPrice=2; break;
                case 2: ip=ItemPropertyBonusSavingThrowVsX(nRandomInGroup, 2); nPrice=7; break;
                case 3: ip=ItemPropertyBonusSavingThrowVsX(nRandomInGroup, 3); nPrice=12; break;
                //case 4: ip=ItemPropertyBonusSavingThrowVsX(nRandomInGroup, 4); nPrice=20; break;
                //case 5: ip=ItemPropertyBonusSavingThrowVsX(nRandomInGroup, 5); nPrice=25; break;
            }
            break;
        case 12: // ----- MIGHTY -----
            n = 5; // don't forget to change this variable, then adding new IP in table
            s = "01_02_03_04_05"; //how much IP costs
            nGC = 1// Group Coefficient
            nGM = 1// Group Multiplier
            nSubGrp = 0;
            switch(nIPNumber){
                case 1: ip=ItemPropertyMaxRangeStrengthMod(1); nPrice=1; break;
                case 2: ip=ItemPropertyMaxRangeStrengthMod(2); nPrice=2; break;
                case 3: ip=ItemPropertyMaxRangeStrengthMod(3); nPrice=3; break;
                case 4: ip=ItemPropertyMaxRangeStrengthMod(4); nPrice=4; break;
                case 5: ip=ItemPropertyMaxRangeStrengthMod(5); nPrice=5; break;
            }
            break;
        case 13: // ----- VAMPIRIC REGENERATION -----
            n = 5; // don't forget to change this variable, then adding new IP in table
            s = "01_02_03_04_05"; //how much IP costs
            nGC = 1// Group Coefficient
            nGM = 1// Group Multiplier
            nSubGrp = 0;
            switch(nIPNumber){
                case 1: ip=ItemPropertyVampiricRegeneration(1); nPrice=1; break;
                case 2: ip=ItemPropertyVampiricRegeneration(2); nPrice=2; break;
                case 3: ip=ItemPropertyVampiricRegeneration(3); nPrice=3; break;
                case 4: ip=ItemPropertyVampiricRegeneration(4); nPrice=4; break;
                case 5: ip=ItemPropertyVampiricRegeneration(5); nPrice=5; break;
            }
            break;
        case 14: // ----- MASSIV CRITICAL -----
            n = 5; // don't forget to change this variable, then adding new IP in table
            s = "01_02_03_04_05"; //how much IP costs
            nGC = 1// Group Coefficient
            nGM = 1// Group Multiplier
            nSubGrp = 0;
            switch(nIPNumber){
                case 1: ip=ItemPropertyMassiveCritical(IP_CONST_DAMAGEBONUS_2); nPrice=1; break;
                case 2: ip=ItemPropertyMassiveCritical(IP_CONST_DAMAGEBONUS_4); nPrice=2; break;
                case 3: ip=ItemPropertyMassiveCritical(IP_CONST_DAMAGEBONUS_6); nPrice=3; break;
                case 4: ip=ItemPropertyMassiveCritical(IP_CONST_DAMAGEBONUS_8); nPrice=4; break;
                case 5: ip=ItemPropertyMassiveCritical(IP_CONST_DAMAGEBONUS_10); nPrice=5; break;
            }
            break;
        case 15: // ----- KEEN -----
            n = 1; // don't forget to change this variable, then adding new IP in table
            s = "05"; //how much IP costs
            nGC = 10// Group Coefficient
            nGM = 1// Group Multiplier
            nSubGrp = 0;
            switch(nIPNumber){
                case 1: ip=ItemPropertyKeen(); nPrice=5; break;
            }
            break;
        case 16: // ----- BONUS FEAT: SPELL FOCUS -----
            n = 1; // don't forget to change this variable, then adding new IP in table
            s = "05"; //how much IP costs
            nGC = 5// Group Coefficient
            nGM = 1// Group Multiplier
            if(nSubGrp==0) nSubGrp = Random(7)+1;
            switch(nSubGrp){
                case 1: ip=ItemPropertyBonusFeat(IP_CONST_FEAT_SPELLFOCUSABJ); nPrice=5; break;
                case 2: ip=ItemPropertyBonusFeat(IP_CONST_FEAT_SPELLFOCUSCON); nPrice=5; break;
                case 3: ip=ItemPropertyBonusFeat(IP_CONST_FEAT_SPELLFOCUSDIV); nPrice=5; break;
                case 4: ip=ItemPropertyBonusFeat(IP_CONST_FEAT_SPELLFOCUSENC); nPrice=5; break;
                case 5: ip=ItemPropertyBonusFeat(IP_CONST_FEAT_SPELLFOCUSEVO); nPrice=5; break;
                case 6: ip=ItemPropertyBonusFeat(IP_CONST_FEAT_SPELLFOCUSILL); nPrice=5; break;
                case 7: ip=ItemPropertyBonusFeat(IP_CONST_FEAT_SPELLFOCUSNEC); nPrice=5; break;
                //case 8: ip=ItemPropertyBonusFeat(IP_CONST_FEAT_SPELLFOCUSNEC); nPrice=15; break;
            }
            break;
        case 17: // ----- BONUS HITPOINTS -----
            n = 5; // don't forget to change this variable, then adding new IP in table
            s = "02_04_06_8_10"; //how much IP costs
            nGC = 2// Group Coefficient
            nGM = 1// Group Multiplier
            nSubGrp = 0;
            switch(nIPNumber){
                case 1: ip=ItemPropertyBonusHitpoints(4); nPrice=2; break;
                case 2: ip=ItemPropertyBonusHitpoints(8); nPrice=4; break;
                case 3: ip=ItemPropertyBonusHitpoints(12); nPrice=6; break;
                case 4: ip=ItemPropertyBonusHitpoints(16); nPrice=8; break;
                case 5: ip=ItemPropertyBonusHitpoints(20); nPrice=10; break;
            }
            break;
    }
    IPParam.n = n;
    IPParam.ip = ip;
    IPParam.subgrp = nSubGrp;
    IPParam.price = nPrice;
    IPParam.s = s;
    IPParam.nGC = nGC;
    return IPParam;
}


понятно что в стандартных банках вещей шмотки созданные RLS сохраняться не будут...
для того, чтобы они сохранялись, нужно в БД банка добавить еще одно поле - список св-в на шмотке (обычно это локальная переменная на шмотке, хотя в нвн1 я для пущей надежности все хранил в теге итема)...
+ ко всему в скрипте переноса вещей из БД в ящик игрока нужно использовать функцию:
Neverwinter Script Source
#include "vns_loot_iptable"
#include "nwnx_sql"

object UpdateItemFromRLS(object oItem, string sBankItemStats)
{
    string sIPList = sBankItemStats;
    string sIP;
    int nPos, nSubPos, n1, n2, n3;
    struct stItemProperty IPParam;

    int nLength = GetStringLength(sBankItemStats);
    int nDebugI = 0;
    while(nLength!=0 && nDebugI<=10){
        nPos = FindSubString(sIPList, "x");
        if(nPos!=-1){ // adding IP
            //SendMessageToPC(oPC, "add ip...");
            sIP = GetSubString(sIPList, 0, nPos+1);

            nSubPos = FindSubString(sIP, "_");
            n1 = StringToInt(GetSubString(sIP, 0, nSubPos+1));
            sIP = GetStringRight(sIP, GetStringLength(sIP) - (nSubPos+1));
            nSubPos = FindSubString(sIP, "_");
            n2 = StringToInt(GetSubString(sIP, 0, nSubPos+1));
            sIP = GetStringRight(sIP, GetStringLength(sIP) - (nSubPos+1));
            n3 = StringToInt(GetSubString(sIP, 0, GetStringLength(sIP)-1));

            IPParam = GetIPFromTable(n1, n2, n3, GetBaseItemType(oItem));
            AddItemProperty(DURATION_TYPE_PERMANENT, IPParam.ip, oItem);

            nLength = GetStringLength(sIPList) - (nPos+1);
            sIPList = GetStringRight(sIPList, nLength);
        }else{
          nLength = 0;
          nDebugI = 11;
       }
       nDebugI++;
    }
   
    return oItem;
}

Русская версия Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)