QUOTE(Misty Archer @ Sep 5 2006, 20:11) [snapback]91104[/snapback]
По поводу второго ответа - можно поподробней
Не думаю что поймешь.. но все же.
NSS
//:://////////////////////////////////////////////
//:: OnEnter am_ten_skl_searh
//:: Copyright © 2005 WRG!
//:://////////////////////////////////////////////
/*
ПРИ УСПЕШНОЙ ПРОВЕРКЕ СКИЛА ПОИСК, СОЗДАЕМ Item.
ResRef создаваемого объекта равен локальному
стрингу на триггере, для всех классов CLASS_TYPE_ALL,
для всех остальных классов персонально для каждого:
CLASS_TYPE_BARBARIAN, CLASS_TYPE_FIGHTER и т.д.
Поле триггера KeyTag - сложность проверки скилла:
DC_EASY = 0; DC_MEDIUM = 1; DC_HARD = 2;
Флоат "DISTANCE" расстояние на котором создается
объект вокруг РС. Локалка "ACTION_MODE_DETECT"
устанавливает свойство триггера, он сработает только
когда РС в режиме обнаружения.
int CLASS_TYPE_BARBARIAN = 0;
int CLASS_TYPE_CLERIC = 2;
int CLASS_TYPE_DRUID = 3;
int CLASS_TYPE_FIGHTER = 4;
int CLASS_TYPE_PALADIN = 6;
int CLASS_TYPE_RANGER = 7;
int CLASS_TYPE_INVALID = 255;
nwscript
*/
//:://////////////////////////////////////////////
//:: Created By: Aiwan
//:: Created On: 31.12.2005 23:24 С новым Годом!
//:://///////////////////////////////////////////
#include "nw_i0_tool"
#include "am_inc_common"
void main()
{
object oPC = GetEnteringObject();
//object oHench = GetAssociate(ASSOCIATE_TYPE_HENCHMAN, oPC);
object oSelf = OBJECT_SELF;
string sMessage = GetName(oSelf); // Сообщение при обнаружении предмета PC
string sHench1 = GetLocalString(oSelf, "HENCHMAN_string_1");
string sHench2 = GetLocalString(oSelf, "HENCHMAN_string_2");
string sHench3 = GetLocalString(oSelf, "HENCHMAN_string_3");
string sHench4 = GetLocalString(oSelf, "HENCHMAN_string_4");
string sHench5 = GetLocalString(oSelf, "HENCHMAN_string_5");
float f = GetLocalFloat(oSelf, "DISTANCE"); // Расстояние от РС для находки
if(f==0.0) f = 2.0; // Если нет, то по умолчанию 2 метра радиус
location lLoc = CreateRandomLocation(oPC, f);
int iDC = StringToInt(GetLockKeyTag(oSelf)); // Сложность проверки скилла
if(!GetIsPC(oPC)||GetIsInCombat(oPC)||GetLocalInt(oSelf, "DEACTIVATED"))
return;
//-----------------------------------
// Ищем в списке помощников Алишан
//-----------------------------------
object oHench = GetObjectByTag("AM_HEN_ALISHAN");
if(!GetIsAssociate(oPC, oHench))
{
oHench = OBJECT_INVALID;
}
//-----------------------------------
if(!GetActionMode(oPC, ACTION_MODE_DETECT) && GetLocalInt(oSelf, "ACTION_MODE_DETECT"))
{
if (GetIsObjectValid(oHench)) // Хеньчман нас предупреждает, что тут что-то есть
{
if(!GetLocalInt(oSelf, "HENCHMAN_SPEAK"))
{
SetLocalInt(oSelf, "HENCHMAN_SPEAK", TRUE);
DelayCommand(0.2, AssignCommand(oHench, PlayVoiceChat(VOICE_CHAT_SEARCH)));
DelayCommand(0.21, AssignCommand(oHench, SpeakString(sHench1)));
}
}
if(GetGameDifficulty() == GAME_DIFFICULTY_EASY || !GetLocalInt(GetModule(), "DEBAG_PC"))
SendMessageToPC(oPC, "<cу >ВКЛЮЧИТЕ РЕЖИМ ОБНАРУЖЕНИЯ.</c>");
return;
}
SetLocalInt(oSelf, "DEACTIVATED", TRUE);
string sResRef = GetLocalString(oSelf, "CLASS_TYPE_ALL"); // Предмет для всех
string sB = GetLocalString(oSelf, "CLASS_TYPE_BARBARIAN"); // Каждому персонально
string sC = GetLocalString(oSelf, "CLASS_TYPE_CLERIC");
string sF = GetLocalString(oSelf, "CLASS_TYPE_FIGHTER");
string sP = GetLocalString(oSelf, "CLASS_TYPE_PALADIN");
string sR = GetLocalString(oSelf, "CLASS_TYPE_RANGER");
string sD = GetLocalString(oSelf, "CLASS_TYPE_DRUID");
int iBestClass = GetCreatureBestClass(oPC); // Ищем лучший класс мультиклассов
// Дебаг класса
string sClass;
if(iBestClass==0) sClass="BARBARIAN";
if(iBestClass==2) sClass="CLERIC";
if(iBestClass==3) sClass="DRUID";
if(iBestClass==4) sClass="FIGHTER";
if(iBestClass==6) sClass="PALADIN";
if(iBestClass==7) sClass="RANGER";
Debug("Лучший класс игрока - "+sClass);
if(sResRef=="") // Если создаем предметы для классов
{
// Приравняем ResRef-ы к единому значению взяв от каждого класса
if(iBestClass==0) sResRef=sB; if(iBestClass==6) sResRef=sP;
if(iBestClass==2) sResRef=sC; if(iBestClass==7) sResRef=sR;
if(iBestClass==4) sResRef=sF; if(iBestClass==3) sResRef=sD;
}
if(AutoDC(iDC, SKILL_SEARCH, oPC))
{
if(sResRef != "")
{
object oItem = CreateObject(OBJECT_TYPE_ITEM, sResRef, lLoc);
AssignCommand(oPC, PlayVoiceChat(VOICE_CHAT_LOOKHERE));
string sRunScript = GetLocalString(oSelf, "RUN_SCRIPT");
if(sRunScript!="")
DelayCommand(2.0, ExecuteScript(sRunScript, oItem));
if(sMessage == "Предмет + [Текст над РС]" || sMessage =="Item + [Текст над РС]")
sMessage = "";
AssignCommand(oPC, SpeakString(sMessage));
SendMessageToPC(oPC, "<c у >Вы обнаружили предмет.</c>");
AssignCommand(oPC, ClearAllActions());
AssignCommand(oPC, ActionDoCommand(SetFacingPoint(GetPositionFromLocation(lLoc))));
DelayCommand(0.3, SetCommandable(FALSE, oPC));
DelayCommand(2.0, SetCommandable(TRUE, oPC));
if (GetIsObjectValid(oHench))
{
AssignCommand(oHench, ClearAllActions());
AssignCommand(oHench, SetFacingPoint(GetPositionFromLocation(lLoc)));
if(GetLocalInt(oSelf, "HENCHMAN_SPEAK"))
{
DelayCommand(3.2, AssignCommand(oHench, PlayVoiceChat(VOICE_CHAT_YES)));
DelayCommand(3.21, AssignCommand(oHench, SpeakString(sHench2)));
}
else
{
DelayCommand(3.2, AssignCommand(oHench, PlayVoiceChat(VOICE_CHAT_GOODIDEA)));
DelayCommand(3.21, AssignCommand(oHench, SpeakString(sHench3)));
}
}
}
else
{
// Если мы забыли написать ResRef предметов, то ошибка
Debug("<cу >ОШИБКА!</c> Не могу создать объект. Нет ResRef-а для класса - "+sClass);
}
}
else
{
if(GetLocalInt(oSelf, "HENCHMAN_SPEAK"))
{
AssignCommand(oPC, PlayVoiceChat(VOICE_CHAT_CANTDO));
AssignCommand(oPC, SpeakString("Я ничего не вижу."));
DelayCommand(3.2, AssignCommand(oHench, PlayVoiceChat(VOICE_CHAT_NO)));
DelayCommand(3.21, AssignCommand(oHench, SpeakString(sHench4)));
DelayCommand(6.2, AssignCommand(oHench, PlayVoiceChat(VOICE_CHAT_MOVEOVER)));
DelayCommand(6.21, AssignCommand(oHench, SpeakString(sHench5)));
}
}
}
Рандомную локацию глянь код в теме базы скриптов.
Вешается на он ентр триггера.
NSS
location CreateRandomLocation(object oTarget, float fRadius, int bOnLine = TRUE)
{
if(!bOnLine)
fRadius=IntToFloat(Random(FloatToInt(fRadius)));
float iXO=VectorMagnitude(GetPosition(oTarget))*cos(VectorToAngle(GetPosition(oTarget)));
float iYO=VectorMagnitude(GetPosition(oTarget))*sin(VectorToAngle(GetPosition(oTarget)));
float fRndomAngle=IntToFloat(Random(360));
location lNEW=Location(GetArea(oTarget),Vector(iXO+fRadius*cos(fRndomAngle),iYO+fRadius*sin(fRndomAngle)),360.0);
return lNEW;
}
int GetCreatureBestClass(object oCr)
{
int class1 = GetClassByPosition(1, oCr);
int class2 = GetClassByPosition(2, oCr);
int class3 = GetClassByPosition(3, oCr);
int classlev1, classlev2, classlev3;
classlev1 = GetLevelByClass(class1, oCr);
if (class2 != CLASS_TYPE_INVALID)
classlev2 = GetLevelByClass(class2, oCr);
if (class3 != CLASS_TYPE_INVALID)
classlev3 = GetLevelByClass(class3, oCr);
int BestClass = class1;
if (classlev1 < classlev2)
BestClass = class2;
if (classlev2 < classlev3)
BestClass = class3;
return BestClass;
}