Вернуться   Raurin Forums > Raurin 3: The Silver Marches (NWN2 шард) > Скриптинг, маппинг и диалогинг :)

Ответ
 
Опции темы Опции просмотра
Старый 20.11.2007, 14:22   #41
Oranj
Бывалый Рауринец
 
Аватар для Oranj
 
Регистрация: 02.02.2007
Сообщения: 548
Власть репутации: 655 Oranj У него еще все впереди!
По умолчанию Re: Вопрос: OnPlayerDying

Комменты связанные с мировоззрением понравились

Тут есть готовые скрипты: http://www.city-of-masters.ru/forums...p?showforum=86
К примеру этот: http://www.city-of-masters.ru/forums...&p=66&#entry66
Oranj is offline   Ответить с цитированием
Старый 20.11.2007, 14:45   #42
Planetouched
Зеленый Рауринец
 
Регистрация: 05.05.2007
Сообщения: 94
Власть репутации: 623 Planetouched У него еще все впереди!
По умолчанию Re: Вопрос: OnPlayerDying

у себя я бахнул этот модуль. у оранжа может остался мы вместе тестировали. В принципе его делать нечего. если нужен прям кровь из носа могу написать..... а так я тоже пример в инете нашел
__________________
Эх помните как в наше время было хорошо. И THAH0 был и AC в минус шел.
Planetouched is offline   Ответить с цитированием
Старый 20.11.2007, 14:52   #43
Oranj
Бывалый Рауринец
 
Аватар для Oranj
 
Регистрация: 02.02.2007
Сообщения: 548
Власть репутации: 655 Oranj У него еще все впереди!
По умолчанию Re: Вопрос: OnPlayerDying

У меня остался, выложить? И какой именно скрипт, там их несколько: heartbeat.NSS, on_death.NSS, on_dying.NSS, on_enter.NSS, on_use.NSS
Oranj is offline   Ответить с цитированием
Старый 20.11.2007, 15:36   #44
Elisar Kronvell
Гость
 
Аватар для Elisar Kronvell
 
Регистрация: 11.11.2007
Адрес: Санкт-Петербург
Сообщения: 25
Власть репутации: 0 Elisar Kronvell У него еще все впереди!
По умолчанию Re: Вопрос: OnPlayerDying

heartbeat.NSS, on_death.NSS, on_dying.NSS
__________________
Истина там, во тьме, и во тьме ты иди - мыслящий бродит во тьме.
В себя самого загляни, открой свою дорогу в Ничто.
В Ничто ты войди, во тьму, и пойми:
Пока ты во тьме, не может она быть Ничем - ведь там ты.
Elisar Kronvell is offline   Ответить с цитированием
Старый 20.11.2007, 16:06   #45
Elisar Kronvell
Гость
 
Аватар для Elisar Kronvell
 
Регистрация: 11.11.2007
Адрес: Санкт-Петербург
Сообщения: 25
Власть репутации: 0 Elisar Kronvell У него еще все впереди!
По умолчанию Re: Вопрос: OnPlayerDying

За скрипт спасибо, нашел у себя багу, понял, как реализовать одну фичу, но... он длительное время использует GetLastDying... Который возвращает последнего, активировавшего событие OnDying, который, как заметил Planetouched, запускается лишь раз. Тоесть в сингле все ок, но что будет при игре на шарде? Если за это время умрет кто-нибудь еще? GetLastDying будет возвращать уже другого игрока. Или я ошибаюсь?
__________________
Истина там, во тьме, и во тьме ты иди - мыслящий бродит во тьме.
В себя самого загляни, открой свою дорогу в Ничто.
В Ничто ты войди, во тьму, и пойми:
Пока ты во тьме, не может она быть Ничем - ведь там ты.
Elisar Kronvell is offline   Ответить с цитированием
Старый 20.11.2007, 16:11   #46
Oranj
Бывалый Рауринец
 
Аватар для Oranj
 
Регистрация: 02.02.2007
Сообщения: 548
Власть репутации: 655 Oranj У него еще все впереди!
По умолчанию Re: Вопрос: OnPlayerDying

Цитата:
Сообщение от heartbeat.NSS
/*Created by Fadedshadow 8/28/02. Feel free to modify,pirate,or whatever to suit your needs. */
void main()
{
object oPC = GetLastPlayerDying();
int nHitPoints = GetCurrentHitPoints(oPC);
effect eHeal = EffectHeal(1);
effect eDamage = EffectDamage(1,DAMAGE_TYPE_MAGICAL,DAMAGE_POWER_PL US_FIVE);
string sDying = "Help ! I'm dying !";
string sStable = "I've stablized.";
string sRecover = "I have recovered.";
/* You can make this 0 so the pc will stay unconcious until healed by someone else. */
if (nHitPoints < 1)
{
if (nHitPoints > -10)
{
int nRoll = (Random(100));
if (GetLocalString(oPC,"sBleeding") == "True" && nRoll <=10)
{
ApplyEffectToObject(DURATION_TYPE_INSTANT, eHeal, oPC);
AssignCommand(oPC,SpeakString(sStable));
SetLocalString(oPC, "sBleeding","False");
if (GetCurrentHitPoints(oPC) >= 1)
{
SetLocalString(oPC, "sBleeding","True");
}
}
if (GetLocalString(oPC,"sBleeding") == "True" && nRoll > 10)
{
ApplyEffectToObject(DURATION_TYPE_INSTANT, eDamage, oPC);
AssignCommand(oPC,SpeakString(sDying));
}
if (nRoll <=33 && GetLocalString(oPC,"sBleeding") =="False")
{
ApplyEffectToObject(DURATION_TYPE_INSTANT, eHeal, oPC);
}
if (GetCurrentHitPoints(oPC) >= 1)
{
SetLocalString(oPC, "sBleeding","True");
AssignCommand(oPC,SpeakString(sRecover));
}
}
}


if(GetCurrentHitPoints(oPC) <= -10)
{
effect eDeath = EffectDeath(FALSE, FALSE);
ApplyEffectToObject(DURATION_TYPE_INSTANT, eDeath, GetLastPlayerDying());
}
}
Цитата:
Сообщение от on_death.NSS
//::///////////////////////////////////////////////
//:: Death Script
//:: NW_O0_DEATH.NSS
//:: Copyright (c) 2001 Bioware Corp.
//:://////////////////////////////////////////////
/*
This script handles the default behavior
that occurs when a player dies.

BK: October 8 2002: Overriden for Expansion
*/
//:://////////////////////////////////////////////
//:: Created By: Brent Knowles
//:: Created On: November 6, 2001
//:://////////////////////////////////////////////
// BMA-OEI 7/20/06 -- Temp death screen
// BMA-OEI 11/08/06 -- Added engine death GUI: SCREEN_DEATH_DEFAULT (ingamegui.ini) is force closed upon resurrection

const string GUI_DEFAULT_DEATH_SCREEN = "SCREEN_DEATH_DEFAULT";

// Resurrect and remove negative effects from oPlayer
//void Raise( object oPlayer );

// Display death pop-up to oPlayer
//void ShowDefaultDeathScreen( object oPlayer );



// Resurrect and remove negative effects from oPlayer
void Raise(object oPlayer)
{
effect eVisual = EffectVisualEffect(VFX_IMP_RESTORATION);

effect eBad = GetFirstEffect(oPlayer);
ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectRe surrection(),oPlayer);
ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectHe al(GetMaxHitPoints(oPlayer)), oPlayer);

//Search for negative effects
while(GetIsEffectValid(eBad))
{
if (GetEffectType(eBad) == EFFECT_TYPE_ABILITY_DECREASE ||
GetEffectType(eBad) == EFFECT_TYPE_AC_DECREASE ||
GetEffectType(eBad) == EFFECT_TYPE_ATTACK_DECREASE ||
GetEffectType(eBad) == EFFECT_TYPE_DAMAGE_DECREASE ||
GetEffectType(eBad) == EFFECT_TYPE_DAMAGE_IMMUNITY_DECREASE ||
GetEffectType(eBad) == EFFECT_TYPE_SAVING_THROW_DECREASE ||
GetEffectType(eBad) == EFFECT_TYPE_SPELL_RESISTANCE_DECREASE ||
GetEffectType(eBad) == EFFECT_TYPE_SKILL_DECREASE ||
GetEffectType(eBad) == EFFECT_TYPE_BLINDNESS ||
GetEffectType(eBad) == EFFECT_TYPE_DEAF ||
GetEffectType(eBad) == EFFECT_TYPE_PARALYZE ||
GetEffectType(eBad) == EFFECT_TYPE_NEGATIVELEVEL)
{
//Remove effect if it is negative.
RemoveEffect(oPlayer, eBad);
eBad = GetFirstEffect(oPlayer);
}
else
eBad = GetNextEffect(oPlayer);
}
//Fire cast spell at event for the specified target
SignalEvent(oPlayer, EventSpellCastAt(OBJECT_SELF, SPELL_RESTORATION, FALSE));
ApplyEffectToObject(DURATION_TYPE_INSTANT, eVisual, oPlayer);
}

// Display death pop-up to oPlayer
void ShowDefaultDeathScreen( object oPlayer )
{
DisplayGuiScreen( oPlayer, GUI_DEFAULT_DEATH_SCREEN, FALSE );
//DisplayMessageBox( oPlayer, 0, GetStringByStrRef(181408), "gui_death_respawn_self", "", FALSE, "", 6603, "", 0, "" );
}



void main()
{
object oPlayer = GetLastPlayerDied();

// * increment global tracking number of times that I died
SetLocalInt(oPlayer, "NW_L_PLAYER_DIED", GetLocalInt(oPlayer, "NW_L_PLAYER_DIED") + 1);

// * BK: Automation Control. Autopcs ignore death
if (GetLocalInt(oPlayer, "NW_L_AUTOMATION") == 10)
{
Raise(oPlayer);
//DelayCommand(1.0, ExecuteScript("crawl", OBJECT_SELF));
return; // Raise and return
}

DelayCommand( 2.5f, ShowDefaultDeathScreen( oPlayer ) );
/*
// * Handle Spirit of the Wood Death
string sArea = GetTag(GetArea(oPlayer));

if (sArea == "MAP_M2Q2F2" && GetDistanceBetweenLocations(GetLocation(GetObjectB yTag("M2Q2F2_M2Q2G")), GetLocation(oPlayer)) < 5.0 && GetLocalInt(GetModule(),"NW_M2Q2E_WoodsFreed") == 0)
{
int bValid;

Raise(oPlayer);
string sDestTag = "WP_M2Q2GtoM2Q2F";
object oSpawnPoint = GetObjectByTag(sDestTag);
AssignCommand(oPlayer,JumpToLocation(GetLocation(o SpawnPoint)));
return;

}

// * in last level of the Sourcestone, move the player to the beginning of the area
// * May 16 2002: or the main area of the Snowglobe (to prevent plot logic problems).
// * May 21 2002: or Castle Never
if (sArea == "M4Q1D2" || sArea == "M3Q3C" || sArea == "MAP_M1Q6A")
{

//Raise(oPlayer);
//string sDestTag = "M4QD07_ENTER";
//object oSpawnPoint = GetObjectByTag(sDestTag);
// AssignCommand(oPlayer, DelayCommand(1.0, JumpToLocation(GetLocation(oSpawnPoint))));
// * MAY 2002: Just popup the YOU ARE DEAD panel at this point
DelayCommand(2.5, PopUpDeathGUIPanel(oPlayer,FALSE, TRUE, 66487));
return;
}

// * make friendly to Each of the 3 common factions
AssignCommand(oPlayer, ClearAllActions());
// * Note: waiting for Sophia to make SetStandardFactionReptuation to clear all personal reputation
if (GetStandardFactionReputation(STANDARD_FACTION_COM MONER, oPlayer) <= 10)
{ SetLocalInt(oPlayer, "NW_G_Playerhasbeenbad", 10); // * Player bad
SetStandardFactionReputation(STANDARD_FACTION_COMM ONER, 80, oPlayer);
}
if (GetStandardFactionReputation(STANDARD_FACTION_MER CHANT, oPlayer) <= 10)
{ SetLocalInt(oPlayer, "NW_G_Playerhasbeenbad", 10); // * Player bad
SetStandardFactionReputation(STANDARD_FACTION_MERC HANT, 80, oPlayer);
}
if (GetStandardFactionReputation(STANDARD_FACTION_DEF ENDER, oPlayer) <= 10)
{ SetLocalInt(oPlayer, "NW_G_Playerhasbeenbad", 10); // * Player bad
SetStandardFactionReputation(STANDARD_FACTION_DEFE NDER, 80, oPlayer);
}

DelayCommand(2.5, PopUpGUIPanel(oPlayer,GUI_PANEL_PLAYER_DEATH));
*/
}

/*
void ClearAllFactionMembers(object oMember, object oPlayer)
{
// AssignCommand(oMember, SpeakString("here"));
AdjustReputation(oPlayer, oMember, 100);
SetLocalInt(oPlayer, "NW_G_Playerhasbeenbad", 10); // * Player bad
object oClear = GetFirstFactionMember(oMember, FALSE);
while (GetIsObjectValid(oClear) == TRUE)
{
ClearPersonalReputation(oPlayer, oClear);
oClear = GetNextFactionMember(oMember, FALSE);
}
}
*/
Цитата:
Сообщение от on_dying.NSS
//::///////////////////////////////////////////////
//:: Dying Script
//:: NW_O0_DEATH.NSS
//:: Copyright (c) 2001 Bioware Corp.
//:://////////////////////////////////////////////
/*
This script handles the default behavior
that occurs when a player is dying.
DEFAULT CAMPAIGN: player dies automatically
*/
//:://////////////////////////////////////////////
//:: Created By: Brent Knowles
//:: Created On: November 6, 2001
//:://////////////////////////////////////////////


void main()
{
/* AssignCommand(GetLastPlayerDying(), ClearAllActions());
AssignCommand(GetLastPlayerDying(),SpeakString( "I Dying"));
PopUpGUIPanel(GetLastPlayerDying(),GUI_PANEL_PLAYE R_DEATH);
*/
// * April 14 2002: Hiding the death part from player
// effect eDeath = EffectDeath(FALSE, FALSE);
// ApplyEffectToObject(DURATION_TYPE_INSTANT, eDeath, GetLastPlayerDying());
SetLocalInt(GetLastPlayerDying(),"dyinig",GetLocal Int(GetLastPlayerDying(),"dyinig")+1);

FloatingTextStringOnCreature(IntToString(GetLocalI nt(GetLastPlayerDying(),"dyinig")),GetLastPlayerDy ing());

}
Моудль здесь
Oranj is offline   Ответить с цитированием
Старый 20.11.2007, 16:13   #47
Planetouched
Зеленый Рауринец
 
Регистрация: 05.05.2007
Сообщения: 94
Власть репутации: 623 Planetouched У него еще все впереди!
По умолчанию Re: Вопрос: OnPlayerDying

когда срабатывает OnHeartBeat, то OBJECT_SELF Это и есть указатель на текущий объект т.е на твоего чара. на OnDying ставишь идентификатор что ты умираешь. SetLocalInt(GetLastDy...,"iamdie",1);

а в OnHeartBeat

if (GetLocalInt(OBJECT_SELF,"iamdye"))
{
тут твои действия

}
__________________
Эх помните как в наше время было хорошо. И THAH0 был и AC в минус шел.
Planetouched is offline   Ответить с цитированием
Старый 20.11.2007, 17:34   #48
Necrosis
Зеленый Рауринец
 
Регистрация: 30.07.2007
Адрес: Зентил Кип
Сообщения: 160
Власть репутации: 618 Necrosis У него еще все впереди!
По умолчанию Re: Вопрос: OnPlayerDying

Цитата:
Сообщение от Elisar Kronvell Посмотреть сообщение
А мне не верится, что ты сможешь сочинить действительно нечто сложное и реализовать скриптами с генерацией по ходу
Специально для Elisar Kronvell
оффтоп
Написал тебе твои скрипты по альтернативной системе смерти

Пишу как сделать так, чтобы игрок подходил к порталу, решал задачу, портал открывался, игрок входил в портал
Для начала это:

Скрипт для прослушывания ответов игрока порталом
допустим назовем его listen
Цитата:
//by Necrosis - 2007 =)
// Это пример скрипта который будет открывать портал обратно в мир живых, если вы правильно решили мат.задачу или ответили на вопрос правильно
// Если PC находится недалеко от портала( у меня в 3 шагах) и правильно решает задачу
// портал открывается( Примечание: чтобы ответить, нужно нажать Enter и ввести ответ.
#include "proverka_listener"

void main()
{
object oSpeaker = OBJECT_SELF;
string sText = GetLastHeardText();



object oPortal = GetNearestObjectByTag("Тэг портала",oSpeaker);
if (oPortal != OBJECT_INVALID) {
string openText = GetLocalString(oPortal,"Ответ на задачу");
if (GetDistanceBetween(oSpeaker,oPortal) < 3.0) {
if (FindSubString(sText,openText) != -1) {
AssignCommand(oPortal,ActionOpenDoor(OBJECT_SELF)) ; // Портал, в данном случае я по умолчанию взял некую дверь, открывается
AssignCommand(oPortal,SpeakString("Задача решена правильно, вернись в мир живых!"));
AddJournalQuestEntry("ВЫ ВЕРНУЛИСЬ В МИР ЖИВЫХ", 2, oSpeaker, FALSE, FALSE, FALSE); // Это запись в дневник
} else {
AssignCommand(oPortal,SpeakString("Задача решена неверно, попытайтесь еще раз"));
}
} else {
AssignCommand(oPortal,SpeakString("Портал: Я не слышу вас, подойдите ближе")); // Если PC стоит слишком далеко от портала
}
}
}


Скрипта паса, назовем pass
Цитата:
// Это выдает портал игроку( некую задачу допустим), можно впиндюрить сюда Random и несколько вариантов ответов
void main()
{
ActionSpeakString("Чтобы портал открылся, реши задачу: "+GetLocalString(OBJECT_SELF,"Ответ на задачу"));
}
Скрипт proverka_listener

Цитата:

object GetLastHeardSpeaker();


string GetLastHeardText();

string GetLastHeardText();


int GetLastHeardMode();


object GetLastHeardListener();

void SupressLastHeardText();

void SendChatMessage(string sMessage, object oSender, int nChannel, object oRecipient=OBJECT_INVALID);

const string DMFI_HEARD = "sDMFIHeard";

void SetLastHeardText(object oSpeaker, string sText)
{
SetLocalString(oSpeaker, DMFI_HEARD,sText);
}

string GetLastHeardText()
{
return(GetLocalString(OBJECT_SELF, DMFI_HEARD));
}

const string DMFI_SPEAKER = "oDMFISpeaker";

void SetLastHeardSpeaker(object oSpeaker)
{
SetLocalObject(OBJECT_SELF, DMFI_SPEAKER,oSpeaker);
}

object GetLastHeardSpeaker()
{
return (GetLocalObject(OBJECT_SELF, DMFI_SPEAKER));
}


const string DMFI_HEARD_MODE = "iDMFIMode";

void SetLastHeardMode(object oSpeaker, int nMode) {
SetLocalInt(oSpeaker,DMFI_HEARD_MODE,nMode);
}

int GetLastHeardMode() {
return GetLocalInt(OBJECT_SELF,DMFI_HEARD_MODE);
}


const string DMFI_OBJECT_LISTENER = "oDMFIListener";

object GetLastHeardListener() {
return GetLocalObject(OBJECT_SELF,DMFI_OBJECT_LISTENER);
}

void SetLastHeardListener(object oSpeaker, object oTold) {
SetLocalObject(oSpeaker,DMFI_OBJECT_LISTENER,oTold );
}

const string DMFI_HEARD_SUPRESS = "bDMFISupress";

int GetIsLastHeardTextSupressed(object oSpeaker)
{
return GetLocalInt(oSpeaker,DMFI_HEARD_SUPRESS);
}

void SupressLastHeardText()
{
SetLocalInt(OBJECT_SELF,DMFI_HEARD_SUPRESS,1);
}

void DeleteLastHeardData(object oSpeaker)
{
DeleteLocalObject(oSpeaker, DMFI_SPEAKER);
DeleteLocalString(oSpeaker, DMFI_HEARD);
DeleteLocalInt(oSpeaker,DMFI_HEARD_MODE);
DeleteLocalObject(oSpeaker,DMFI_OBJECT_LISTENER);
DeleteLocalInt(oSpeaker,DMFI_HEARD_SUPRESS);
}

string GetListenHandlerScript()
{
return(GetLocalString(GetModule(),"&DMFI_LISTENER" ));
}

void SetListenHandlerScript(string scriptName)
{
SetLocalString(GetModule(),"&DMFI_LISTENER",script Name);
}
Дальше создаешь placeable портал ака дверь или ворота, заходишь в свойства, дальше Scripts -> Variables, добавляешь Value Name Ответ на задачу
Value Float 0
Value Int 0
ValueString здесь пишешь задачу, например уравнение из элементарной математики
ValueUnsigned 0
ValueType String

Идем дальше, ставишь на OnFailToOpen мой скрипт pass

Ну и не забудь порталу поставить уникальный тэг и вписать его в скрипт listen (Тэг портала)
Necrosis is offline   Ответить с цитированием
Старый 20.11.2007, 18:10   #49
Elisar Kronvell
Гость
 
Аватар для Elisar Kronvell
 
Регистрация: 11.11.2007
Адрес: Санкт-Петербург
Сообщения: 25
Власть репутации: 0 Elisar Kronvell У него еще все впереди!
По умолчанию Re: Вопрос: OnPlayerDying

Necrosis
Спасибо. До лабиринтов с задачами, правда, пока еще далеко. Но когда дело дойдет - будет легче. В частности не знал, как это реализуется на практике - теперь знаю.
P.S. В следующий раз, пожалуйста, юзай тег code, а не quote - читать не удобно.
P.P.S. Еще раз спасибо.
__________________
Истина там, во тьме, и во тьме ты иди - мыслящий бродит во тьме.
В себя самого загляни, открой свою дорогу в Ничто.
В Ничто ты войди, во тьму, и пойми:
Пока ты во тьме, не может она быть Ничем - ведь там ты.
Elisar Kronvell is offline   Ответить с цитированием
Старый 20.11.2007, 18:15   #50
Necrosis
Зеленый Рауринец
 
Регистрация: 30.07.2007
Адрес: Зентил Кип
Сообщения: 160
Власть репутации: 618 Necrosis У него еще все впереди!
По умолчанию Re: Вопрос: OnPlayerDying

Цитата:
Сообщение от Elisar Kronvell Посмотреть сообщение
P.S. В следующий раз, пожалуйста, юзай тег code, а не quote - читать не удобно.
Чтобы читать было удобно. Копируешь набитый скрипт, вставляешь в тулсет, читаешь.
Necrosis is offline   Ответить с цитированием
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
You may not post new threads
You may not post replies
You may not post attachments
You may edit your posts

BB code is Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Часовой пояс GMT, время: 21:10.

Powered by vBulletin Version R.I.P., Copyright ©2000-2024, Jelsoft Enterprises Ltd. | Оформление: raurin.ru