Цитата(Heather @ Feb 25 2015, 18:21)

пет или ловушка
Насчет пета не знаю, но ловушка это точно)))
Цитата(Heather @ Feb 25 2015, 18:21)

а как это сделать?
Не знаю, но я частенько замечал, что некоторые монстры покидают, а некоторые нет. Можно схитрить и сделать немного по другому: т.к там дверь, а не триггер, то можно пожалуй вообще исключить возможность стандартного перехода из области, т.е для жуков его точно не должно быть. В свойствах двери оставить пустой строку тега назначения, а в типе выстовить голочку дверь. Получится, что перехода как такового нет. А чтобы персонаж все же мог перейти, поставить в слоте OnAreaTransitionClick хороший скрипт создателя рыцарской саги.
Код
//:://////////////////////////////////////////////
//:: Created By: Gennady УНИВЕРСАЛЬНЫЙ СКРИПТ ПЕРЕМЕЩЕНИЙ
//:: Created On: 5.10.2006 Авто сохранение
//:://////////////////////////////////////////////
#include "ludi"
void main()
{
object oSelf = OBJECT_SELF;
object oPoint = GetWaypointByTag("WP_" + GetTag(oSelf));
object oPC = GetFirstPC();
if ((GetArea(oPC) == GetArea(oSelf)&&GetDistanceBetween(oPC, oSelf) < 3.0) ||
GetIsPC(GetEnteringObject()))
{
if(GetLocalInt(oSelf, "OPEN_SD") == 1)
JumpFirstPC(oPoint);
else
{
SetLocalInt(oSelf,"OPEN_SD",1);
DoSinglePlayerAutoSave();
DelayCommand(60.0,SetLocalInt(oSelf,"OPEN_SD",0));
}
}
else
AssignCommand(GetEnteringObject(), ClearAllActions());
}
// помещать в слот OnUsed OnEnter OnClick OnAreaTransitionClick
// Точка перемещения содержит WP_+Тег объекта
Но к нему нужна инклюда, т.е чтобы в твоем модуле/хаке был следующий скрипт
Код
///////////////////////////////////////////////
// *** БИБЛИОТЕКА *** #include "ludi"
///////////////////////////////////////////////
// ____________ Генерируем случайную точку _____________________________________
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;
}
// ЗАМЕНА МАЛОЙ БУКВЫ Я
// --------- Использование МОЯ СТОЯТЬ КАК СТЕНА
// 1) string sTokenValue = "Мо"+ya()+" сто"+ya()+"ть как стена";
// 2) string sTokenValue = ya("Мойа стойать как стена");
string ya(string sTokenValue = "йа");
// Перемещаем создание к точкам днем и ночью
// object oWPD - Точка день
// object oWPN - Точка ночь
// object oPS - Существо перемещаемое
void pLudey(object oWPD, object oWPN, object oPS);
// Любой персонаж в радиусе 12 метров, который видит ГЕРОЯ,
// и имеет класс простолюдин, но не имеет класса животное
object NPCAlerts(object oPC);
// ТЕКСТ НАД ПЕРСОНАЖЕМ
// object oPC - ПЕРСОНАЖ
// string sTokenValue - ТЕКСТ НАД ПЕРСОНАЖЕМ
void text(object oPC, string sTokenValue);
// Перемещение людей
// object oPC - Существо
// object oWP - Точка Перемещение
void Jump(object oPC, object oWP);
// ПЕРЕМЕЩЕНИЕ ГЕРОЯ и всей его свиты к точке object oWP
void JumpFirstPC(object oWP);
// ДАТЬ ПРЕДМЕТ ИЗ ПАЛИТРЫ
// string sItemTemplate - ResRef предмета
// object oTarget - Объект или существо кому дать
// int nStackSize - Количество предметов, если они слаживаемые
void CreateItemPC(string sItemTemplate, object oTarget=OBJECT_SELF, int nStackSize=1);
// ВЫЗВАТЬ ИЗ ПАЛИТРЫ
// nObjectType: OBJECT_TYPE_ITEM, OBJECT_TYPE_CREATURE, OBJECT_TYPE_PLACEABLE,
// OBJECT_TYPE_STORE, OBJECT_TYPE_WAYPOINT
// string sTemplate - ResRef ВЫЗЫВАЕМОГО
// location lLocation - ЛОКАЦИЯ ВЫЗОВА
// bUseAppearAnimation
// ПРИСВОИТЬ НОВЫЙ ТЭГ
void CreateObjectN(int nObjectType, string sTemplate, location lLocation, int bUseAppearAnimation=FALSE, string sNewTag="");
// ДОПОЛНИТЕЛЬНЫЙ УРОН ДЛЯ ЗАКЛИНАНИЯ
// object oSelf - Объект = OBJECT_SELF
// int Damage - делитель максимальных ХР
void SpellDamage(object oSelf, int Damage);
//ПЕРЕДВИЖЕНИЕ ПЛЕЙСА
// object oSelf - Объект управлЯющий передвижением
// string sGtTag - тэг передвигаемого объекта
// float fDist=0.1 - дистанциЯ одного шага
// float fSpeed=0.3 - скорость кадра
// int iShag=20 количество создаваемых объектов (кадров)
// float fOrient=180.0 - направление движениЯ
void multik(object oSelf, string sGtTag, float fDist=0.1, float fSpeed=0.3, int iShag=20, float fOrient=180.0);
// ЛОКАЦИЯ ОТНОСИТЕЛЬНО ОБЪЕКТА
// object oTarget - сам объект
// float fRadius - радиус локации от объекта
// float fAngle - градусы угла (0.0 - 360.0):
// 0.0 - 3 часа; 90.0 - 12 часов; 180.0 - 9 часов; 270.0 - 6 часов.
// float fAngle - oTarget равен GetFacing(oTarget)
// float fZ=0.0 - добавить высоту (по умолчанию равна высоте oTarget)
// float fOpient=0.0 - величина осевого угла локации
location CreateLocation(object oTarget, float fRadius, float fAngle, float fZ=0.0, float fOpient=0.0);
// ПЕРЕМЕННАЯ ТОРГОВОЙ РЕПУТАЦИИ
// int iRepa - величина смены репутации (от - 3 до 10 пунктов)
void ReputationTorg(int iRepa);
// Текущий день
int Day();
//КОПИЯ ОБЪЕКТА
// object oSource - объкт который копируем
// location locLocation - локациЯ где поЯвитсЯ копиЯ
// object oOwner = OBJECT_INVALID - если копируем предмет,
// то его можно положить другому существу или плейсу
// string sNewTag = "" - присвоим копии новый тэг
void CopyObjectN(object oSource, location locLocation, object oOwner = OBJECT_INVALID, string sNewTag = "");
// ____________________ КОПИЯ ОБЪЕКТА __________________________________________
void CopyObjectN(object oSource, location locLocation, object oOwner = OBJECT_INVALID, string sNewTag = "")
{CopyObject(oSource, locLocation, oOwner, sNewTag);}
//______________ Перемещение день-ночь _________________________________________
void pLudey(object oWPD, object oWPN, object oPS)
{
if (oPS==OBJECT_INVALID||oWPD==OBJECT_INVALID||oWP
N==OBJECT_INVALID) return;
int T = GetTimeHour();
if(T>=7 && T<21) // день
{
if (GetLocalInt(OBJECT_SELF, "PEREMESH") != 1)
{
AssignCommand(oPS, ClearAllActions());
DelayCommand(0.1, CopyObjectN(oPS, GetLocation(oWPD)));
DestroyObject(oPS, 0.3);
DelayCommand(2.0, SetLocalInt(OBJECT_SELF,"PEREMESH",1));
}
}
else if (GetLocalInt(OBJECT_SELF, "PEREMESH") != 2) // ночь
{
AssignCommand(oPS, ClearAllActions());
DelayCommand(0.1, CopyObjectN(oPS, GetLocation(oWPN)));
DestroyObject(oPS, 0.3);
DelayCommand(2.0, SetLocalInt(OBJECT_SELF,"PEREMESH",2));
}
} // ДЛЯ СПЯЩИХ СКРИПТ de_sleep HB
//__________________________________________________
____________________________
object NPCAlerts(object oPC)
{
object oNPC = GetFirstObjectInShape(SHAPE_SPHERE, 12.0, GetLocation(OBJECT_SELF), TRUE);
object oPC = GetFirstPC();
while (GetIsObjectValid(oNPC))
{
if (GetObjectSeen(oPC, oNPC) && GetLevelByClass(CLASS_TYPE_COMMONER, oNPC) >= 1
&& !GetIsDead(oNPC) && GetLevelByClass(CLASS_TYPE_ANIMAL, oNPC) == FALSE)
return oNPC;
oNPC = GetNextObjectInShape(SHAPE_SPHERE, 12.0, GetLocation(OBJECT_SELF), TRUE);
}
return oNPC;
}
//__________________________________________________
____________________________
void OpenContainer(object oPC)
{
object oSelf = OBJECT_SELF;
object oItem = GetFirstItemInInventory(oSelf);
if (oItem == OBJECT_INVALID) return; // Если уже нет предметов
object oPC = GetFirstPC();
object oNPC = NPCAlerts(oPC); // ЕСТЬ ЛИ В РАД 12 МЕТРОВ КТО? ВИДИТ ЛИ ОН PC?
vector vFace = GetPosition(oSelf);
location lNPC = GetLocation(oNPC);
int nMas = 20 + GetSkillRank(SKILL_HIDE, oPC);
int nPass = (GetSkillRank(SKILL_HIDE, oPC) + d20()) - (GetSkillRank(SKILL_SPOT, oNPC) + d20());
string sHide = "Бросок (Уход в тень): <cуу >20+"+IntToString(GetSkillRank(SKILL_HIDE, oPC))+"</c>";
if (GetLocalInt(OBJECT_SELF, "NPC_PROV") == 1) return;
if (GetIsObjectValid(oNPC))
{
if (GetStealthMode(oPC) == STEALTH_MODE_ACTIVATED)
{
if (nPass >= 0)
{
GiveXPToCreature(oPC, nMas);
AssignCommand(oPC, SpeakString("Никто не видит... Можно брать..."));
FloatingTextStringOnCreature("<c у >ВАС НЕ ЗАМЕТИЛИ!</c>", oPC);
SendMessageToPC(oPC, "<c °у>"+sHide+"</c>");
SetLocalInt(OBJECT_SELF, "NPC_PROV",1);
return;
}
else
FloatingTextStringOnCreature("Ваша маскировка замечена.", oPC);
}
}
else
{
SetLocalInt(OBJECT_SELF, "NPC_PROV",1);
AssignCommand(oPC, SpeakString("Никто не видит... Можно брать..."));
return;
}
AssignCommand(oNPC, ClearAllActions());
AssignCommand(oPC, ClearAllActions());
PlayVoiceChat(VOICE_CHAT_HELP, oNPC);
AssignCommand(oNPC, SetFacingPoint(vFace));
AssignCommand(oPC, SetFacingPoint(GetPosition(oNPC)));
AssignCommand(oPC, ActionPlayAnimation(ANIMATION_FIREFORGET_PAUSE_SCRATCH_HEAD));
AssignCommand(oPC, SpeakString("Похоже, за мной кто-то наблюдает..."));
AssignCommand(oNPC, ActionSpeakString("Эй, не трогай это!"));
AssignCommand(oNPC, ActionPlayAnimation(ANIMATION_LOOPING_TALK_FORCEFUL, 1.0, 3.0));
AssignCommand(oNPC, ActionForceMoveToObject(oPC, TRUE, 1.0, 5.0));
AssignCommand(oNPC, ActionDoCommand(PlayVoiceChat(VOICE_CHAT_NO, oNPC)));
AssignCommand(oNPC, ActionSpeakString("Это не твое. Уходи!"));
AssignCommand(oNPC, ActionPlayAnimation(ANIMATION_FIREFORGET_TAUNT));
AssignCommand(oNPC, ActionDoCommand(AssignCommand(oSelf, ActionStartConversation(oPC,"konteiner"))));
AssignCommand(oNPC, ActionDoCommand(AssignCommand(oSelf, ActionPlayAnimation(ANIMATION_PLACEABLE_CLOSE))));
AssignCommand(oNPC, ActionForceMoveToLocation(lNPC, FALSE, 5.0));
if(Random(100) >= 50)
{
AssignCommand(oNPC, ActionSpeakString("Эх, можешь брать это барахло. Только ничего не ломай!"));
SetLocalInt(OBJECT_SELF, "NPC_PROV",1);
}
else
{
AssignCommand(oNPC, ActionSpeakString("Не тобой положено, не тебе и брать!"));
SetLocalInt(oPC, "VOR_COMMONER", GetLocalInt(oPC, "VOR_COMMONER") + 1);
if(GetLocalInt(oPC, "VOR_COMMONER")>=10)
DelayCommand(16.1, ExecuteScript("stop_commoner", oPC));
}
DelayCommand(0.2, SetCommandable(FALSE, oPC)); // заблокировать очередь
DelayCommand(0.3, SetCommandable(FALSE, oNPC));
DelayCommand(15.0, SetCommandable(TRUE, oNPC));
DelayCommand(15.2, AssignCommand(oNPC, ClearAllActions()));
DelayCommand(15.3, AssignCommand(oNPC, SetFacingPoint(vFace)));
DelayCommand(16.0, SetCommandable(TRUE, oPC));
}
//___________________ ЗАМЕНА МАЛОЙ БУКВЫ Я _____________________________________
string ya(string sTokenValue = "йа")
{
string sYa = GetName(GetObjectByTag("ax_letter_ya"));
string sResult = "";
string sSub;
int i = 0;
while ((sSub = GetSubString(sTokenValue, i, 2)) != "")
{
if (sSub == "йа")
{
sResult += sYa;
i += 2;
}
else
{
sResult += GetStringLeft(sSub, 1);
i++;
}
}
return sResult;
}
// _____________________ ДАТЬ ПРЕДМЕТ ИЗ ПАЛИТРЫ _______________________________
void CreateItemPC(string sItemTemplate, object oTarget=OBJECT_SELF, int nStackSize=1)
{CreateItemOnObject(sItemTemplate, oTarget, nStackSize);}
// ____________________ ВЫЗВАТЬ ИЗ ПАЛИТРЫ _____________________________________
void CreateObjectN(int nObjectType, string sTemplate, location lLocation, int bUseAppearAnimation=FALSE, string sNewTag="")
{CreateObject(nObjectType, sTemplate, lLocation, bUseAppearAnimation, sNewTag);}
// __________________ ТЕКСТ НАД ПЕРСОНАЖЕМ _____________________________________
void text(object oPC, string sTokenValue)
{
AssignCommand(oPC, SpeakString(sTokenValue));
}
//____________________ Перемещение людей _______________________________________
void Jump(object oPC, object oWP)
{
AssignCommand(oPC, ClearAllActions());
AssignCommand(oPC, JumpToObject(oWP));
}
//____________________ ПЕРЕМЕЩЕНИЕ ГЕРОЯ _______________________________________
void JumpFirstPC(object oWP)
{
object oPC = GetFirstPC();
object oNPC = GetFirstObjectInArea(oPC);
AssignCommand(oPC, ClearAllActions());
AssignCommand(oPC, JumpToObject(oWP));
while (GetIsObjectValid(oNPC))
{
if (oPC==GetMaster(oNPC))
{
AssignCommand(oNPC, ClearAllActions());
AssignCommand(oNPC, JumpToObject(oWP));
}
oNPC = GetNextObjectInArea(oPC);
}
}
//______________ ДОПОЛНИТЕЛЬНЫЙ УРОН ДЛЯ ЗАКЛИНАНИЯ ____________________________
void SpellDamage(object oSelf, int Damage)
{
object oPC = GetLastSpellCaster();
int iD = GetCurrentHitPoints(oSelf);// Текущие ХР
int iDM = GetMaxHitPoints(oSelf)/Damage;// Повреждение
string siD = IntToString(iDM);
effect eDamage = EffectDamage(iDM);
effect eSav = EffectSavingThrowDecrease(SAVING_THROW_ALL, 10, SAVING_THROW_TYPE_ALL);
effect eKosti = EffectVisualEffect(VFX_COM_CHUNK_BONE_MEDIUM);
location lSmoke = GetLocation(oSelf);
if (iDM > iD)
{
if (iD < 12) return;
iD = iD-10;
iDM = iD; siD = IntToString(iDM);
effect eDamageM = EffectDamage(iDM);
ApplyEffectToObject(DURATION_TYPE_INSTANT,eDamageM,oSelf);
ApplyEffectAtLocation(DURATION_TYPE_INSTANT,eKosti,lSmoke);
}
else
ApplyEffectToObject(DURATION_TYPE_INSTANT,eDamage,oSelf);
ApplyEffectToObject(DURATION_TYPE_TEMPORARY,eSav,oSelf,10.0);
SendMessageToPC(oPC, "<c °у>"+GetName(oSelf)+"</c> получил урон от <c °у>"+GetName(oPC)+"</c>: (<cу >"+siD+"</c>)");
}
//____________________ ПЕРЕДВИЖЕНИЕ ПЛЕЙСА _____________________________________
void multik(object oSelf, string sGtTag, float fDist=0.1, float fSpeed=0.3, int iShag=20, float fOrient=180.0)
{
if (GetLocalInt(oSelf,"STENA") == 1) return;
object oPlace = GetNearestObjectByTag(sGtTag, oSelf);
effect eVis = EffectVisualEffect(VFX_DUR_CUTSCENE_INVISIBILITY); // невидимость
effect eIskra = EffectVisualEffect(VFX_COM_SPARKS_PARRY);
int i;
AssignCommand(oSelf, ClearAllActions());
AssignCommand(oSelf, ActionPlayAnimation(ANIMATION_PLACEABLE_DEACTIVATE));
ApplyEffectToObject(DURATION_TYPE_INSTANT, eIskra, oSelf);
DelayCommand(1.0, ApplyEffectToObject(DURATION_TYPE_PERMANENT, eVis, oPlace));
for (i=1; i<iShag; i++)
{
vector vSpawn = GetPosition(oPlace);
float fFacing = GetFacing(oPlace);
vSpawn.x += cos(fFacing) * fDist*i;
vSpawn.y += sin(fFacing) * fDist*i;
// Если отрицательное значение, то locSpawn позади oPC
location locSpawn = Location(GetArea(oPlace), vSpawn, fOrient+fFacing);
object oNew = CreateObject(OBJECT_TYPE_PLACEABLE, GetResRef(oPlace), locSpawn, FALSE, sGtTag);
SetPlotFlag(oNew, TRUE); // Сюжетный
ApplyEffectToObject(DURATION_TYPE_PERMANENT, eVis, oNew);
AssignCommand(oSelf, ActionDoCommand(RemoveEffect(oNew, GetFirstEffect(oNew))));
if (i<(iShag-1))
{
if (i<3) AssignCommand(oSelf, ActionWait(1.0));
else AssignCommand(oSelf, ActionWait(fSpeed));
AssignCommand(oSelf, ActionDoCommand(ApplyEffectToObject(DURATION_TYPE_PERMANENT, eVis, oNew)));
AssignCommand(oSelf, ActionDoCommand(DestroyObject(oNew, 0.5)));
}
}
AssignCommand(oPlace,PlaySound("al_cv_millwheel1"));
DelayCommand(4.0, AssignCommand(oPlace,PlaySound("as_cv_minercar1")));
SetLocalInt(oSelf,"STENA",1);
AssignCommand(oSelf, ActionDoCommand(ApplyEffectToObject(DURATION_TYPE_INSTANT, eIskra, oSelf)));
AssignCommand(oSelf, ActionPlayAnimation(ANIMATION_PLACEABLE_ACTIVATE));
AssignCommand(oSelf, ActionDoCommand(SetLocalInt(oSelf,"STENA",0)));
AssignCommand(oSelf, ActionDoCommand(DestroyObject(oPlace)));
}
//_________________ Действие с большим числом предметов в инвентаре ____________
int Match(string s1, string s2)
{
return (s1 == s2);
}
// ------- Проверить
// int StartingConditional()
// {return (GetNumItemsInInventory(GetPCSpeaker(), "ТЕГ") >= 3);}
int GetNumItemsInInventory(object oInventory = OBJECT_SELF, string sTag = "*")
{
int nNum = 0;
object oItem = GetFirstItemInInventory(oInventory);
while (GetIsObjectValid(oItem))
{
if (Match(GetTag(oItem), sTag))
nNum += GetItemStackSize(oItem);
oItem = GetNextItemInInventory(oInventory);
}
return nNum;
}
// -------- Забрать (если число отрицательное -3, забрать все)
// void main()
// {RemoveItemsFromInventory(GetPCSpeaker(), "ТЕГ", 3);}
int RemoveItemsFromInventory(object oInventory = OBJECT_SELF, string sTag = "*", int nNum = -1)
{
int nStack;
object oItem = GetFirstItemInInventory(oInventory);
while (GetIsObjectValid(oItem) && (nNum != 0))
{
if (Match(GetTag(oItem), sTag))
{
if (nNum < 0) DestroyObject(oItem);
else if ((nStack = GetItemStackSize(oItem)) > nNum)
{
SetItemStackSize(oItem, nStack - nNum);
return 0;
}
else
{
DestroyObject(oItem);
nNum -= nStack;
}
}
oItem = GetNextItemInInventory(oInventory);
}
return nNum;
}
//___________________ ЛОКАЦИЯ ОТНОСИТЕЛЬНО ОБЪЕКТА _____________________________
location CreateLocation(object oTarget, float fRadius, float fAngle, float fZ=0.0, float fOpient=0.0)
{
vector vTarget = GetPosition(oTarget);
float fXNew = vTarget.x+(fRadius*cos(fAngle));
float fYNew = vTarget.y+(fRadius*sin(fAngle));
float fZNew = vTarget.z+fZ;
vector vNew = Vector(fXNew,fYNew,fZNew);
location LNew = Location(GetArea(oTarget), vNew , fOpient);
return LNew;
}
// _______________ ПЕРЕМЕННАЯ ТОРГОВОЙ РЕПУТАЦИИ _______________________________
void ReputationTorg(int iRepa)
{
object oPC = GetFirstPC();
int iReput = GetLocalInt(oPC,"TORGOVEZ_REPA");
int iNew =iReput+iRepa;
if (iNew >= 10) iNew = 10;
if (iNew <= -3) iNew = -3;
SetLocalInt(oPC,"TORGOVEZ_REPA",iNew);
if (iRepa > 0)
SendMessageToPC(oPC, ya("Ваша репутацийа повысилась на: <c у >"+IntToString(iRepa)+"0%</c>"));
else
SendMessageToPC(oPC, ya("Ваша репутацийа понизилась на: <cу >"+IntToString(iRepa)+"0%</c>"));
}
// _______________ Текущий день _______________________________________________
int Day()
{
int nDay = GetCalendarDay();
int nMes = 28*GetCalendarMonth();
int nYear = GetCalendarYear();
int iDay = 336*nYear+nMes+nDay;
return iDay;
}
//void main(){}
В нем конечно много лишнего, а точнее нам ненужного. Скрипт все таки писался для другого модуля со своими нуждами.
Цитата(Heather @ Feb 25 2015, 18:21)

Да, человеческой расы, но пол может быть и женским.
Хм, не знал насчет пола
В книгах частенько встречаются мелкие ошибки. То пробел отсутствует после точки, то запятая пропущена. И еще, не используй букву Ё она в игре выглядит как ,