///////////////////////////////////////////////////////////////////////////// // // File : player_custom.skrit // Author(s): Witness (Lisa Hui), Jason 'Ikkyo' Gripp // Purpose : Allows for periodic player logic that doesn't need to be tied to // any other item -- such as class based enchantment bonuses, // passive spells, etc. -- client-side or UI player logic, and // storage of temporary character data // History : v4.1 [November 14, 2004] // - fixes Null Pointer Exception coming from UpdateRunSpeed$ when // boots are unequipped // - only adds self to boot slot equip notify list if DS Revived is // active // // v4.0 [November 8, 2004] // - merges player_custom.skrit from Dungeon Siege Revived v0.9.1 beta // with character.skrit from Dark and Light Elves v3.0 beta (history // is continued from character.skrit) // // v3.0 [November 6, 2004] // - adds equip slot specific blocking variables and state code // // v2.0 [October 31, 2004] // - removed all the state code, now just used to store equip match // variables // // v1.0 // //---------------------------------------------------------------------------- // Version: 4.1 Date: November 14, 2004 //---------------------------------------------------------------------------- ////////////////////////////////////////////////////////////////////////////// property bool _server_only$ = false; //SHARED PROPERTIES property string race$ = ""; //DS REVIVED PROPERTIES property bool disable_armor$ = false; property bool disable_weapons$ = false; //DARK AND LIGHT ELVES PROPERTIES property string head$ = ""; property int block_es_feet$ = 0; property bool equip_es_feet$ = false; property string limit_es_feet_sum$ = ""; property string limit_es_feet_set$ = ""; property string notify_equip_feet$ = ""; property int block_es_chest$ = 0; property bool equip_es_chest$ = false; property string limit_es_chest_sum$ = ""; property string limit_es_chest_set$ = ""; property string notify_equip_chest$ = ""; property int block_es_head$ = 0; property bool equip_es_head$ = false; property string limit_es_head_sum$ = ""; property string limit_es_head_set$ = ""; property string notify_equip_head$ = ""; property int block_es_forearms$ = 0; property bool equip_es_forearms$ = false; property string limit_es_forearms_sum$ = ""; property string limit_es_forearms_set$ = ""; property string notify_equip_forearms$ = ""; property int block_es_melee$ = 0; property string notify_equip_melee$ = ""; property int block_es_ranged$ = 0; property string notify_equip_ranged$ = ""; property int block_es_shield$ = 0; property string notify_equip_shield$ = ""; owner = GoSkritComponent; ////////////////////////////////////////////////////////////////////////////// // GLOBALS ////////////////////////////////////////////////////////////////////////////// //SHARED GLOBALS Go player$; //DS REVIVED GLOBALS Go current_boots$; float boot_bonus$; float base_speed$; //int fix_inventory$; bool current_primary_spell_equipped$; Go current_primary_spell$; int current_magic_level$; void UpdateRunSpeed$( ) { Go boots$ = player$.Inventory.GetEquipped( ES_FEET ); float speed$ = 1.0; if(boots$ != current_boots$) { current_boots$ = boots$; if ( boots$ != NULL ) { if( boots$.HasMagic() ) { String suffix_name$ = boots$.Magic.SuffixModifierName; if(suffix_name$ == "") { boot_bonus$ = 0.0; } else if(suffix_name$ == "ofpacing") { boot_bonus$ = 0.1; } else if(suffix_name$ == "ofhst") { boot_bonus$ = 0.2; } else if(suffix_name$ == "ofspeed") { boot_bonus$ = 0.3; } else if(suffix_name$ == "ofaccel") { boot_bonus$ = 0.4; } else { boot_bonus$ = 0.0; } } else { boot_bonus$ = 0.0; } } else { boot_bonus$ = 0.0; } } speed$ += boot_bonus$; // Check for haste if( player$.Actor.HasGenericState( "haste" ) ) { speed$ += player$.Actor.GetGenericStateSpellLevel( "haste" )/200.0; } player$.Body.SetAvgMoveVelocity( base_speed$ * speed$ ); } //DARK AND LIGHT ELVES GLOBALS #include "k_inc_block" bool revived$; string paperdoll$; //void debug$(string state$, string msg$) { // if ( state$ != "" ) { // StringTool.AssignF( msg$, "(%s) %s", state$, msg$ ); // } // report.screenf("%s (%d)> %s", owner.Go.TemplateName, MakeInt(owner.Goid), msg$); //} ////////////////////////////////////////////////////////////////////////////// // STATES ////////////////////////////////////////////////////////////////////////////// startup State Init$ { //DS REVIVED INIT trigger OnGoHandleMessage$( WE_CONSTRUCTED ) { //...unnecessary if it is set in the skills block of the corresponding hero template? //if(race$ != "") //{ // owner.Go.Actor.SetBaseSkillLevel(race$, 1); //} player$ = owner.Go; base_speed$ = player$.Body.GetAvgMoveVelocity(); boot_bonus$ = 0; current_primary_spell$ = NULL; current_primary_spell_equipped$ = false; current_magic_level$ = 0; current_boots$ = NULL; paperdoll$ = ""; } //DARK AND LIGHT ELVES INIT trigger OnGoHandleMessage$( WE_ENTERED_WORLD ) { //player$ = owner.Go; //determine whether or not DS Revived is loaded revived$ = ( UIShell.FindUIWindow( "rollover_bg2", "rollover_help" ) != NULL ); //watch boot slot for revived's speed modifiers if ( revived$ ) { StringTool.AssignF( notify_equip_feet$, "%d,", MakeInt( owner.Goid ) ); } GoInventory inventory$ = player$.Inventory; Go equipped$; if ( equip_es_chest$ ) { equipped$ = inventory$.GetEquipped( ES_CHEST ); if ( equipped$ != NULL ) { inventory$.RSUnequip( ES_CHEST, AO_HUMAN ); inventory$.RSEquip( ES_CHEST, equipped$.Goid, AO_HUMAN ); } } if ( equip_es_feet$ ) { equipped$ = inventory$.GetEquipped( ES_FEET ); if ( equipped$ != NULL ) { inventory$.RSUnequip( ES_FEET, AO_HUMAN ); inventory$.RSEquip( ES_FEET, equipped$.Goid, AO_HUMAN ); } } if ( equip_es_forearms$ ) { equipped$ = inventory$.GetEquipped( ES_FOREARMS ); if ( equipped$ != NULL ) { inventory$.RSUnequip( ES_FOREARMS, AO_HUMAN ); inventory$.RSEquip( ES_FOREARMS, equipped$.Goid, AO_HUMAN ); } } if ( equip_es_head$ ) { equipped$ = inventory$.GetEquipped( ES_HEAD ); if ( equipped$ != NULL ) { inventory$.RSUnequip( ES_HEAD, AO_HUMAN ); inventory$.RSEquip( ES_HEAD, equipped$.Goid, AO_HUMAN ); } } SetState Think$; } } State Think$ { bool selected$, //added for revived hide_armor$, //added for revived hide_weapons$, //added for revived hide_es_chest$, hide_es_feet$, hide_es_forearms$, hide_es_head$, hide_es_melee$, hide_es_shield$, hide_es_ranged$; event OnEnterState$ { //debug$("Think$", "OnEnterState$"); hide_es_chest$ = false; hide_es_feet$ = false; hide_es_forearms$ = false; hide_es_head$ = false; hide_es_melee$ = false; hide_es_shield$ = false; hide_es_ranged$ = false; hide_armor$ = false; hide_weapons$ = false; selected$ = false; //player$.IsSelected; this.CreateTimer( 1, 0.0 ); } trigger OnTimer$( 1 ) { //selected$ = player$.IsSelected; if ( selected$ != player$.IsSelected ) { if ( !player$.IsSelected ) { //when a character is deselected, blocks must be removed immediately //so that the next selected character can set their own blocks selected$ = false; bool block$ = ( block_es_chest$ > 0 ); if ( block$ || ( block$ != hide_es_chest$ ) ) { UnBlockSlot$( "armor", "", "ghost_armor", "" ); //"139,279,201,374" //"141,282,201,372" } block$ = ( block_es_feet$ > 0 ); if ( block$ || ( block$ != hide_es_feet$ ) ) { UnBlockSlot$( "boots", "", "ghost_boots", "" ); //"157,378,181,427" //"156,379,182,427" } block$ = ( block_es_forearms$ > 0 ); if ( block$ || ( block$ != hide_es_forearms$ ) ) { UnBlockSlot$( "gauntlets", "", "ghost_gauntlets", "" ); //"205,278,227,323" //"205,278,229,325" } block$ = ( block_es_head$ > 0 ); if ( block$ || ( block$ != hide_es_head$ ) ) { UnBlockSlot$( "helmet", "", "ghost_helmet", "" ); //"149,232,192,275" //"158,233,186,273" } block$ = ( block_es_melee$ > 0 ); if ( block$ || ( block$ != hide_es_melee$ ) ) { UnBlockSlot$( "melee_weapon", "", "ghost_melee", "" ); //"90,353,135,444" //"92,354,134,443" } block$ = ( block_es_shield$ > 0 ); if ( block$ || ( block$ != hide_es_shield$ ) ) { UnBlockSlot$( "shield", "", "ghost_shield", "" ); //"205,353,250,444" //"210,366,247,434" } block$ = ( block_es_ranged$ > 0 ); if ( block$ || ( block$ != hide_es_ranged$ ) ) { UnBlockSlot$( "ranged_weapon", "", "ghost_ranged", "" ); //"90,232,135,323" //"103,232,125,322" } hide_es_chest$ = false; hide_es_feet$ = false; hide_es_forearms$ = false; hide_es_head$ = false; hide_es_melee$ = false; hide_es_ranged$ = false; hide_es_shield$ = false; if ( revived$ ) { if ( disable_armor$ != hide_armor$ ) { if ( disable_armor$ ) { block_es_chest$ += 1; block_es_feet$ += 1; block_es_forearms$ += 1; block_es_head$ += 1; } else { block_es_chest$ -= 1; block_es_feet$ -= 1; block_es_forearms$ -= 1; block_es_head$ -= 1; } } if ( disable_weapons$ != hide_weapons$ ) { if ( disable_armor$ ) { block_es_melee$ += 1; block_es_ranged$ += 1; block_es_shield$ += 1; } else { block_es_melee$ -= 1; block_es_ranged$ -= 1; block_es_shield$ -= 1; } } hide_armor$ = false; hide_weapons$ = false; if ( paperdoll$ != "" ) { paperdoll$ = ""; UIShell.FindUIWindow( "character_paperdoll", "character" ).LoadTexture("b_gui_ig_mnu_cp_bot_01", false); } } this.DestroyTimer( 2 ); } else { selected$ = true; this.CreateTimer( 2, 0.5 ); this.SetTimerRepeatCount( 2, -1 ); } } } trigger OnTimer$( 2 ) { if ( selected$ ) { //DS REVIVED PERIODIC LOGIC //translate fix inventory values into block equip slot values so that //Revived inventory blocks utilize Dark and Light Elves' block slot routines //fix_inventory$ = ( (disable_armor$ || disable_weapons$) && (player$ == Server.ScreenHero) ); if ( revived$ ) { bool update_paperdoll$ = false; if ( disable_armor$ != hide_armor$ ) { hide_armor$ = disable_armor$; if ( hide_armor$ ) { block_es_chest$ += 1; block_es_feet$ += 1; block_es_forearms$ += 1; block_es_head$ += 1; } else { block_es_chest$ -= 1; block_es_feet$ -= 1; block_es_forearms$ -= 1; block_es_head$ -= 1; } update_paperdoll$ = true; } if ( disable_weapons$ != hide_weapons$ ) { hide_weapons$ = disable_armor$; if ( hide_weapons$ ) { block_es_melee$ += 1; block_es_ranged$ += 1; block_es_shield$ += 1; } else { block_es_melee$ -= 1; block_es_ranged$ -= 1; block_es_shield$ -= 1; } update_paperdoll$ = true; } if ( update_paperdoll$ ) { if ( disable_armor$ && !disable_weapons$ ) { paperdoll$ = "b_gui_ig_mnu_cp_bot_02"; UIShell.FindUIWindow( "character_paperdoll", "character" ).LoadTexture("b_gui_ig_mnu_cp_bot_02", false); } else if ( !disable_armor$ && disable_weapons$ ) { paperdoll$ = "b_gui_ig_mnu_cp_bot_03"; UIShell.FindUIWindow( "character_paperdoll", "character" ).LoadTexture("b_gui_ig_mnu_cp_bot_03", false); } else if ( disable_armor$ && disable_weapons$ ) { paperdoll$ = "b_gui_ig_mnu_cp_bot_04"; UIShell.FindUIWindow( "character_paperdoll", "character" ).LoadTexture("b_gui_ig_mnu_cp_bot_04", false); } else if ( paperdoll$ != "" ) { paperdoll$ = "b_gui_ig_mnu_cp_bot_01"; UIShell.FindUIWindow( "character_paperdoll", "character" ).LoadTexture("b_gui_ig_mnu_cp_bot_01", false); } } if ( update_paperdoll$ ) { if ( disable_armor$ && !disable_weapons$ ) { UIShell.FindUIWindow( "character_paperdoll", "character" ).LoadTexture("b_gui_ig_mnu_cp_bot_02", false); } else if ( !disable_armor$ && disable_weapons$ ) { UIShell.FindUIWindow( "character_paperdoll", "character" ).LoadTexture("b_gui_ig_mnu_cp_bot_03", false); } else if ( disable_armor$ && disable_weapons$ ) { UIShell.FindUIWindow( "character_paperdoll", "character" ).LoadTexture("b_gui_ig_mnu_cp_bot_04", false); } else { UIShell.FindUIWindow( "character_paperdoll", "character" ).LoadTexture("b_gui_ig_mnu_cp_bot_01", false); } } } //DARK AND LIGHT ELVES PERIODIC LOGIC if ( UIShell.IsInterfaceVisible( "character" ) ) { bool block$ = ( block_es_chest$ > 0 ); if ( block$ != hide_es_chest$ ) { hide_es_chest$ = block$; if ( hide_es_chest$ ) { BlockSlot$( "armor", "", "ghost_armor", "" ); } else { UnBlockSlot$( "armor", "", "ghost_armor", "" ); //"139,279,201,374" //"141,282,201,372" } } block$ = ( block_es_feet$ > 0 ); if ( block$ != hide_es_feet$ ) { hide_es_feet$ = block$; if ( hide_es_feet$ ) { BlockSlot$( "boots", "", "ghost_boots", "" ); } else { UnBlockSlot$( "boots", "", "ghost_boots", "" ); //"157,378,181,427" //"156,379,182,427" } } block$ = ( block_es_forearms$ > 0 ); if ( block$ != hide_es_forearms$ ) { hide_es_forearms$ = block$; if ( hide_es_forearms$ ) { BlockSlot$( "gauntlets", "", "ghost_gauntlets", "" ); } else { UnBlockSlot$( "gauntlets", "", "ghost_gauntlets", "" ); //"205,278,227,323" //"205,278,229,325" } } block$ = ( block_es_head$ > 0 ); if ( block$ != hide_es_head$ ) { hide_es_head$ = block$; if ( hide_es_head$ ) { BlockSlot$( "helmet", "", "ghost_helmet", "" ); } else { UnBlockSlot$( "helmet", "", "ghost_helmet", "" ); //"149,232,192,275" //"158,233,186,273" } } block$ = ( block_es_melee$ > 0 ); if ( block$ != hide_es_melee$ ) { hide_es_melee$ = block$; if ( hide_es_melee$ ) { BlockSlot$( "melee_weapon", "" , "ghost_melee", "" ); } else { UnBlockSlot$( "melee_weapon", "", "ghost_melee", "" ); //"90,353,135,444" //"92,354,134,443" } } block$ = ( block_es_shield$ > 0 ); if ( block$ != hide_es_shield$ ) { hide_es_shield$ = block$; if ( hide_es_shield$ ) { BlockSlot$( "shield", "", "ghost_shield", "" ); //"0,0,0,0" } else { UnBlockSlot$( "shield", "", "ghost_shield", "" ); //"205,353,250,444" //"210,366,247,434" } } block$ = ( block_es_ranged$ > 0 ); if ( block$ != hide_es_ranged$ ) { hide_es_ranged$ = block$; if ( hide_es_ranged$ ) { BlockSlot$( "ranged_weapon", "" , "ghost_ranged", "" ); } else { UnBlockSlot$( "ranged_weapon", "", "ghost_ranged", "" ); //"90,232,135,323" //"103,232,125,322" } } } } } event OnGoHandleMessage$( eWorldEvent e$, WorldMessage msg$ ) { if ( e$ == WE_SELECTED ) { //debug$("Think$", "WE_SELECTED"); //in case deselection happens in rapid succession, wait a fraction //of a second before determining select state this.CreateTimer( 1, 0.1 ); } else if ( e$ == WE_DESELECTED ) { //debug$("Think$", "WE_DESELECTED"); //in case deselection happens in rapid succession, wait a fraction //of a second before determining select state this.CreateTimer( 1, 0.1 ); } else if ( e$ == WE_EQUIPPED || e$ == WE_UNEQUIPPED ) { UpdateRunSpeed$(); } else if ( e$ == WE_LEVELED_UP ) { int kills$ = GoDB.GetQuestInt(player$.Goid, "ikkyo", "kills") + 1; GoDB.SSetQuestInt(player$.Goid, "ikkyo", "kills", kills$); if(kills$ % 100 == 0) { string name$; player$.Common.GetScreenName(name$); Report.Screenf("%s has just reached %d all-time kills!", name$, kills$ ); } } else if ( e$ == WE_MP_PLAYER_SET_CHARACTER_LEVEL ) { if ( owner.Go.PlayerId == MakePlayerId( msg$.GetData1 ) ) { int level$ = Math.ToInt(player$.Actor.GetSkillLevel("uber")); string name$; player$.Common.GetScreenName(name$); Report.Screenf("%s has just reached level %d!", name$, level$ ); } } } event OnGoUpdate$( float /*delta_t$*/ ) { // So spells get equipped/unequipped messages Go spell$ = player$.Inventory.GetItem(IL_ACTIVE_PRIMARY_SPELL); int magic_level$ = 0; if(spell$ != NULL) { magic_level$ = Math.ToInt(spell$.Magic.GetMagicLevel( player$ )); } if( current_primary_spell$ != spell$ || magic_level$ != current_magic_level$ ) { if( current_primary_spell$ == spell$ && current_primary_spell_equipped$ ) { if( magic_level$ < current_primary_spell$.Magic.RequiredCastLevel ) { SendWorldMessage( WE_UNEQUIPPED, player$.Goid, current_primary_spell$.Goid ); current_primary_spell_equipped$ = false; } } else if( current_primary_spell$ != NULL && current_primary_spell_equipped$ ) { SendWorldMessage( WE_UNEQUIPPED, player$.Goid, current_primary_spell$.Goid ); current_primary_spell_equipped$ = false; } current_magic_level$ = magic_level$; current_primary_spell$ = spell$; if( current_primary_spell$ != NULL ) { if( current_magic_level$ >= current_primary_spell$.Magic.RequiredCastLevel && !current_primary_spell_equipped$) { SendWorldMessage( WE_EQUIPPED, player$.Goid, current_primary_spell$.Goid ); current_primary_spell_equipped$ = true; } } } } }