-
Posts
1,238 -
Joined
-
Last visited
-
Days Won
28
Community Answers
-
Skorm's post in How to make an npc speak automatically? was marked as the answer
prontera,100,100,1 script WalkNearMe 100,10,10,{ end; OnTouch: npctalk "Hello world"; end; } It is activated by the presence of the character. The "10,10" after "100," in the NPC header refers to the x and y distance from the NPC with which a character can "bump" into the NPC and trigger the OnTouch: event.
-
Skorm's post in gold room 1 a week was marked as the answer
I was looking at this topic and I think the script would work better like this so the player can enter multiple times throughout the week if he didn't use his 30 minutes up.prontera,150,150,5 script gold room 456,{ function t { function s; set [email protected], getarg(0); if ( [email protected] <= 0 ) return getarg(0); set [email protected], [email protected] / 86400; set [email protected], [email protected] % 86400 / 3600; set [email protected], [email protected] % 3600 / 60; set [email protected], [email protected] % 60; return ( ( [email protected] ? [email protected] +" day"+ s( [email protected] ) : "" ) + ( [email protected] ? [email protected] +" hour"+ s( [email protected] ) : "" ) + ( [email protected] ? [email protected] +" min"+ s( [email protected] ) : "" ) + ( [email protected] ? [email protected] +" sec"+ s( [email protected],1 ) : "" ) ); function s { return ( ( getarg(0) > 1 ? "s" : "" ) + ( getarg(1,0) ? "" : " " ) ); } } if ( gltimer <= 0 && enter_gold_room < gettimetick(2) ) { set gltimer, .glt; enter_gold_room = gettimetick(2) + 86400 * .dly; } else if ( enter_gold_room > gettimetick(2) && gltimer <= 0 ) { mes "I'm sorry you can't enter in the gold room. You must wait "+ t( enter_gold_room - gettimetick(2) )+"."; close; } mes "You have "+t( gltimer )+" remaining."; select( "enter in the gold room" ); warp .map$,0,0; end; OnPCLoadMapEvent: if(strcharinfo(3)==.map$) { attachnpctimer; initnpctimer; } end; OnTimer1000: if( playerattached() ){ if(strcharinfo(3)!=.map$) { stopnpctimer; end; } set gltimer, gltimer-1; attachnpctimer; initnpctimer; if( gltimer <= 0 ) { stopnpctimer; warp "prontera",0,0; message strcharinfo(0), "end of time for the gold room"; end; } } end; OnInit: set .dly , 7 ; //Delay in days. set .glt , 1800 ; //Gold Room Timer in seconds. set .map$, "geffen" ; //Gold Room map. setmapflag .map$, mf_loadevent; end; }I was also thinking about doing this with a rental item like a pass but I'm not sure if the time is consumed while the player is offline. -
Skorm's post in Modify hourly point snpc was marked as the answer
Currently untested you'll have to let me know if somethings up.
At this point I'm just compiling all of my edits into this script because many people are asking for it.
//===== Hourly Points Script ========================================= //===== By: ========================================================== //= GorthexTiger modified by Nibi //===== Current Version: ============================================= //= 1.4.1 //===== Compatible With: ============================================= //= Any eAthena Version //===== Description: ================================================= //= Get Points every successful hours of gameplay, you cannot get //= the points even if you miss a second or a minute. A player will //= get a very big bonus if they played 3 hours consecutively //= or without logging out of the game. If the player is vending //= the script will then stop. //===== Additional Comments: ========================================= //= You can modify the script to your liking. //= The default points is Kafrapoints change it anyway if you like. //= 1.1 = Check Chatting too //= 1.2 = 5 Minute Idle Check & @at/@autotrade check. //= 1.3 = Corrected the current balance line on 12 Hours Consecutive //= 1.4 = Added command to check remaining time and updated idle check. (Skorm) //= 1.4.1 = Modified the msgs to display according to .timer. (Skorm) //==================================================================== - script hourlypoints -1,{ OnPointGet: //Check for idle. while(checkvending() >= 1 || checkchatting() == 1 || checkidle() >= .idle) { if( [email protected]$ == "" ) { dispbottom set( [email protected]$, "The hourly points event stopped because you were vending, chatting, or idle!" ); set @hourly_points_timer, 0; } sleep2 .delay; } @consecutive_timer++; [email protected]_string$ = Time2Str( @consecutive_timer * ( .timer / 1000 ) ); dispbottom "You received "+.points+" Kafrapoint(s) by staying ingame for "[email protected]_string$+"."; #CASHPOINTS = #CASHPOINTS + .points; dispbottom "Current Balance = "+#CASHPOINTS+" Kafrapoints"; @consecutive_bonus++; //Check for consecutive timer. if(@consecutive_bonus == .cdelay) { @consecutive_bonus = 0; #CASHPOINTS = #CASHPOINTS + .cpoints; dispbottom "You receive a bonus "+.cpoints+" Kafrapoint(s) by playing for "[email protected]_string$+" consecutively!!!"; dispbottom "Current Balance = "+#CASHPOINTS+" Kafrapoint(s)"; } OnPCLoginEvent: addtimer .timer,"hourlypoints::OnPointGet"; @hourly_points_timer = gettimetick(2) + ( .timer / 1000 ); end; OnCmdHour: message strcharinfo(0),@hourly_points_timer ? Time2Str( @hourly_points_timer )+" remaining before you get your Hourly Reward(s).":"Something went wrong or you're considered idle at the moment, try relogging!"; end; OnInit: bindatcmd "ctr","hourlypoints::OnCmdHour"; //@ctr to view time till next point. .timer = 1000*60*60; //Timer in milliseconds. ( Default: 1000*60*60 [ = 1 Hour ] ) .cdelay = 3; //Delay before receiving the consecutive bonus. ( Default: 3 [ { ~ 3 Hours } *Using default timer ] ) .cpoints = 10; //Points gained for consecutive time online. ( Default: 10 ) .points = 1; //Normal points gained. ( Default: 1 ) .delay = 1000; //Delay for idle re-check check. ( Default: 1000 [ = 1 Second ] ) .idle = 60*5; //Player is idle after not moving for this many seconds. ( Default: 60*5 [ = 5 Minutes ] ) } - script check -1,{ OnInit: bindatcmd "check",strnpcinfo(3)+"::OnCheck"; end; OnCheck: dispbottom "You have " +#CASHPOINTS+ " cash points."; end; } -
Skorm's post in Bloody Branch MVP kill announcer & MVP Announcer script was marked as the answer
I think this is a better approach because the latter will still trigger on normal spawning MVPS.
Change the Bloody Branch item script to...
monster "this",-1,-1,"--ja--",-3,1,"BB_MVP_Announce::OnBBMVPDeath"; And then add this npc...
- script BB_MVP_Announce -1,{ OnBBMVPDeath: announce "'"+ strcharinfo(0) +"' has killed ("+ getmonsterinfo(killedrid,MOB_NAME) +").",bc_yellow|bc_all; end; }
-
Skorm's post in 1 Cash every 1 minute was marked as the answer
- script Sample -1,{ OnPointGet: #CASHPOINTS++; end; OnPCLoginEvent: addtimer 60000,"Sample::OnPointGet"; }
-
Skorm's post in Guild Package. was marked as the answer
I cannot be bothered to test this but I'm pretty sure...
At line 983 would do the trick.
if(sd != NULL && sd->status.guild_id == guild_id) { // do stuff that needs the guild_id first, BEFORE we wipe it npc_event_doall_id("OnLeaveGuild", account_id); if (sd->state.storage_flag == 2) //Close the guild storage. storage_guild_storageclose(sd); guild_send_dot_remove(sd); channel_pcquit(sd,3); //leave guild and ally chan sd->status.guild_id = 0; sd->guild = NULL; sd->guild_emblem_id = 0; if (g->instance_id) { struct map_data *mapdata = map_getmapdata(sd->bl.m); if (mapdata->instance_id) { // User was on the instance map if (mapdata->save.map) pc_setpos(sd, mapdata->save.map, mapdata->save.x, mapdata->save.y, CLR_TELEPORT); else pc_setpos(sd, sd->status.save_point.map, sd->status.save_point.x, sd->status.save_point.y, CLR_TELEPORT); } } clif_name_area(&sd->bl); //Update display name [Skotlex] status_change_end(&sd->bl,SC_LEADERSHIP,INVALID_TIMER); status_change_end(&sd->bl,SC_GLORYWOUNDS,INVALID_TIMER); status_change_end(&sd->bl,SC_SOULCOLD,INVALID_TIMER); status_change_end(&sd->bl,SC_HAWKEYES,INVALID_TIMER); status_change_end(&sd->bl,SC_EMERGENCY_MOVE,INVALID_TIMER); //@TODO: Send emblem update to self and people around } else { npc_event_doall_id("OnKickGuild"); } If they are not online when being kicked it would trigger OnKickGuild without an RID attached.
Edit: Also moved topic to source requests since it's becoming a source thing.
-
Skorm's post in Zeny on mobs was marked as the answer
Another way that's a little more involved but probably better for the server. Would be to just add an item that the mob could drop which when consumed increases the players zeny by a specific amount. You could make an item for each amount like 1k 10k 100k etc.
- script sampledrop -1,{ OnInit: addmonsterdrop 1002,90000,100; // 1% Poring Zeny Bag } Example item_db_usable
- Id: 90000 AegisName: Zeny Bag Name: Zeny Bag Type: Cash Buy: 10 Weight: 10 EquipLevelMin: 1 Script: | Zeny += 10000; -----------------------------------------------------------
Again another way that you might accomplish this would be to enable:
// Zeny from mobs zeny_from_mobs: yes In monster.conf
And then edit the formula in mob.cpp to follow some kind of curve based on mob level.
if(battle_config.zeny_from_mobs && md->level) { // zeny calculation moblv + random moblv [Valaris] zeny=(int) ((md->level+rnd()%md->level)*per*bonus/100.); if(md->db->mexp > 0) zeny*=rnd()%250; }
-
Skorm's post in Please help me on this script that'll connect arrays in 1 block of script. was marked as the answer
Maybe something like this.
prontera,157,176,5 script guide 650,1,1,{ end; OnTouch: [email protected] = atoi(strnpcinfo(2)); if([email protected]+1 == getarraysize(.npc_pos_x)) { dispbottom "End"; } else { switch([email protected]) { case 0: npctalk "Hello I'm the first NPC!"; break; case 1: npctalk "Hello I'm the second NPC!"; break; default: npctalk "Hello I'm NPC #"[email protected]+"."; break; } unitwalk getcharid(3),.npc_pos_x[[email protected]+1],.npc_pos_y[[email protected]+1]; } end; OnInit: getmapxy([email protected]$,[email protected],[email protected],BL_NPC,strnpcinfo(0)); [email protected] = atoi(strnpcinfo(2)); .npc_pos_x[[email protected]] = [email protected]; .npc_pos_y[[email protected]] = [email protected]; } prontera,157,170,6 duplicate(guide) guide#1 650,1,1 prontera,157,162,6 duplicate(guide) guide#2 650,1,1 prontera,157,153,6 duplicate(guide) guide#3 650,1,1 prontera,152,150,6 duplicate(guide) guide#4 650,1,1
-
Skorm's post in PVP Party Warp was marked as the answer
setarray [email protected]_maps$, "prontera", "izlude", "geffen", "morroc"; if(getpartyleader(getcharid(1),2) == getcharid(0)) { getpartymember getcharid(1), 1; getpartymember getcharid(1), 2; for ( [email protected] = 0; [email protected] < [email protected]; [email protected]++ ) if ( isloggedin( [email protected][[email protected]], [email protected][[email protected]] ) ) if(inarray([email protected]_maps$, strcharinfo(3,[email protected][[email protected]])) > -1) warp "pvp_y_1-2",0,0,[email protected][[email protected]]; warpparty "Leader",0,0,getcharid(1),"pvp_y_1-2",1,1; }
-
Skorm's post in Restricting commands for GM staff was marked as the answer
Sorry about that yeah you're right they were doing the same thing here is an updated version.
- script warp_block -1,{ OnInit: bindatcmd "warp",strnpcinfo(3)+"::OnAtcommand",20,99; setarray .maps_from$[0], "guild_01", "guild_02"; // Maps they cannot warp from. setarray .maps_to$[0], "guild_01", "guild_02"; // Maps they cannot warp to. end; OnAtcommand: if(inarray(.maps_from$[0], strcharinfo(3))>-1) { message strcharinfo(0), "You can't open use warp here!"; end; } if([email protected]_numparameters) { if (inarray(.maps_to$[0], strtolower([email protected]_parameters$[0]))>-1) { message strcharinfo(0), "You can't warp to that map!"; end; } atcommand "@warp "+ implode([email protected]_parameters$, " "); } else atcommand "@warp"; end; }
-
Skorm's post in Not working OnClaimReward: was marked as the answer
@Get Backers Seems like you've got the right idea... It's strnpcinfo(0) not NPC_NAME though.
- script LoginRewards#1 -1,{ OnPCLoginEvent: addtimer 3600000, strnpcinfo(0)+"::OnClaimReward"; end; OnClaimReward: dispbottom "You have been online 1 hour. Talk to Hourly Reward NPC to get your rewards!"; }
-
Skorm's post in need to cutin to received gold points was marked as the answer
switch(input([email protected], 1, 30000)) { case -1: //Values less than 1 case 1: //Values greater than 30000 mes "Something went wrong!"; close2; cutin "",255; end; default: break; } if ([email protected] > goldPoint) { mes "Sorry, you don't have any Gold"; close2; cutin "",255; end; } https://github.com/rathena/rathena/blob/master/doc/script_commands.txt#L1556
-
Skorm's post in anyone have weemapcache? was marked as the answer
@Tokei made a mapcache editor that superseded weemapcache.
If you really need weemapcache I have it.
WeeMapCache.exe
-
Skorm's post in Create an NPC inside an instance was marked as the answer
prontera,173,200,4 script Blah -1,5,5,{ end; OnTouch: if(!instance_id()) end; npctalk "This is a message!"; monster "place",60,100,"Poring",1002,1,"NPCNAME::OnLabel"; disablenpc instance_npcname(strnpcinfo(0)); } This is the best way to figure out commands.
https://github.com/rathena/rathena/blob/master/doc/script_commands.txt#L6194
-
Skorm's post in R> Script Unequip equipment condition. was marked as the answer
In your item database the last two script sections are for equip and unequip...
In both items add something like this two the equip script.
if(isequipped(1599)) unequip(EQI_SHOES); Anyways that's all I'm saying.
-
Skorm's post in A getunitdata question. was marked as the answer
Here there might be a better way of doing this but this is the method I've come up with tested and it's working quite well.
prontera,260,69,1 script monsterspawner 100,{ OnMinionSummon: [email protected]_id = 1002; [email protected]_count = 10; monster "prontera",255,55,"Pink Evil Minions",[email protected]_id,[email protected]_count,strnpcinfo(0)+"::OnMinionKill"; copyarray .gid[getarraysize(.gid)], [email protected][0], [email protected]_count; end; OnMinionKill: [email protected] = getarraysize(.gid); for([email protected] = 0; [email protected] < [email protected]; [email protected]++) { if(unitexists(.gid[[email protected]])) { getunitdata(.gid[[email protected]],[email protected]); if([email protected][UMOB_HP]) { dispbottom [email protected][UMOB_X]+" "[email protected][UMOB_Y]+" HP:"[email protected][UMOB_HP]; deletearray .gid[[email protected]], 1; break; } } else { deletearray .gid[[email protected]], 1; [email protected]; } } }
-
Skorm's post in [Item Script] Low HP Trigger was marked as the answer
autobonus2 "{ if( Hp <= MaxHp * 5 / 10 && @item_cooldown <= gettimetick(0) ){ set @item_cooldown, gettimetick(0) + 300000; percentheal 100,0; sc_start SC_KYRIE,6000000,10; } }",1000,1,BF_SHORT|BF_LONG,"{ specialeffect2 EF_FIRESPLASHHIT; }"; I had to use temporary character variables for the cooldown as the effect is triggered 100% of the time but with the condition that the players hp <= 50% of maxhp. So it is triggered but not activated. What this means is the cooldown will persist even after the player dies.
-
Skorm's post in Timer Pub for woe was marked as the answer
@hikashin-rae You're lucky I was randomly browsing google to see if people were able to find the woe timer I made for Euphy's WOE Setter and found your post.
http://upaste.me/a34345394862f242d
-
Skorm's post in Understanding Simple Sample Dynamic Shop was marked as the answer
It took me a bit to understand dynamic shops when I was first learning too. This is the npc I used to understand dynamic shops but I added a bunch of comments hopefully it helps. ( Disclaimer: This npc is old and doesn't have all the necessary weight checks and mumbo-jumbo I'm providing it as an example because it's simple. )
- shop custom_seller2 -1,501:20 // Create our dummy shop. prontera.gat,95,99,5 script WoE Shop 100,{ // This code runs when the user clicks our npc. mes "I will sell you items for " + getitemname(.CoinID) + "."; // Let the user know about our shop. callshop "custom_seller2",1; // Summon our dummy shop filled with custom items. npcshopattach "custom_seller2"; // Attach the shop to this npc. end; // This code runs when a user purchases an item from our shop. OnBuyItem: [email protected] = getarraysize(.customs); // Get the number of customs we've added. [email protected]_len = getarraysize(@bought_nameid); // Get the number of purchased items. for( set @i, 0; @i < [email protected]; set @i, @i+1 ) { // Loop through all our custom items. for( set @d,0; @d < [email protected]_len; set @d, @d+1 ) { // Loop through all the purchased items. if( @bought_nameid[@d] == .customs[@i] ) { // Check if the purchased item equals our custom item. if( countitem(.CoinID) >= .Price[@i] * @bought_quantity[@d] ) { // Check if the user has the correct funds. delitem .CoinID,.Price[@i]*@bought_quantity[@d]; getitem @bought_nameid[@d],@bought_quantity[@d]; } } } } deletearray @bought_quantity, getarraysize(@bought_quantity); // Remove the array. deletearray @bought_nameid, getarraysize(@bought_nameid); // Remove the array. close; // This code runs first. When the server is started. OnInit: setarray .customs[0],12103,607,678; // An array of our custom items. set .CoinID,7227; // Currency used for the transaction. setarray .Price[0],20,40,300; // The amount of coins needed for our items. (For example: Item 12103 = 20 coins) npcshopitem "custom_seller2",0,0; // Remove all items from our dummy shop. for( set [email protected], 0; .customs[[email protected]]; set [email protected], [email protected]+1 ) // Loop through our custom items. npcshopadditem "custom_seller2",.customs[[email protected]],.Price[[email protected]]; // Add our custom items to the cleared dummy shop. end; }
-
Skorm's post in Adding multiple SQL Values using insert was marked as the answer
query_sql("INSERT INTO `event_rewards` ( `account_id`, `event_name`, `id`, `amount`, `value` ) VALUES ( "[email protected]_id[.i]+", '"[email protected]$+"', "[email protected][.j]+", "[email protected][.k]+", 0) ");
-
Skorm's post in Petloot directly in Inventory was marked as the answer
Find line 1179 in pet.c should look something like this.
} else { // Item Targeted, attempt loot if (!check_distance_bl(&pd->bl, target, 1)) { // Out of range if(!unit_walktobl(&pd->bl, target, 1, 1)) // Unreachable target. pet_unlocktarget(pd); return 0; } else { struct flooritem_data *fitem = (struct flooritem_data *)target; Comment out this part.
if(pd->loot->count < pd->loot->max) { memcpy(&pd->loot->item[pd->loot->count++],&fitem->item,sizeof(pd->loot->item[0])); pd->loot->weight += itemdb_weight(fitem->item.nameid)*fitem->item.amount; map_clearflooritem(target); } add below.
if (!pc_additem(sd, &fitem->item, fitem->item.amount, LOG_TYPE_PICKDROP_PLAYER)) { map_clearflooritem(target); }
-
Skorm's post in Item Inventory Position Help was marked as the answer
quiz_00,17,124,4 script Katonai 821,{ mes .npc$; mes "Hello there!"; mes "I can enchant your items,"; mes "for a small fee of "+.pric+"z."; emotion e_no1,0; next; if(select("Yes:No")&2) { mes .npc$; mes "Alright, thanks anyways!"; close; } if(Zeny<.pric) { mes .npc$; mes "I'm sorry you don't have enough Zeny, please come back later."; close; } mes .npc$; mes "Which item would you like to enchant?"; next; for( [email protected] = 0; [email protected] < .e_len; [email protected]++ ) { if(getequipid(.equiploc[[email protected]])>-1) { set [email protected]$, [email protected]$+.eqp$[[email protected]]+"- [^0000FF"+getitemname(getequipid(.equiploc[[email protected]]))+"^000000]:"; } else { set [email protected]$, [email protected]$+"^adb4be"+.eqp$[[email protected]]+"- [Empty]^000000:"; } } select([email protected]$); set [email protected]_loc, .equiploc[@menu-1]; set [email protected]_itm, getequipid([email protected]_loc); if([email protected]_itm<0) { mes .npc$; mes "Hmm, I don't think you have anything equipped there."; close; } set [email protected]$, ""; set([email protected],(getiteminfo([email protected]_itm,2)==4?4:[email protected]_loc)); for(set([email protected],0);[email protected]<getarraysize(getd(".itm"[email protected]));set([email protected],[email protected]+1)) { set([email protected],getd(".itm"[email protected]+"["[email protected]+"]")); if(getiteminfo([email protected],2)>-1) if(set([email protected],countitem([email protected]))) { set [email protected]$, [email protected]$+getitemname([email protected])+" x"[email protected]+":"; set [email protected],[email protected]+1; set [email protected][[email protected]], [email protected]; } } if([email protected]$=="") { mes .npc$; mes "Hmm, you don't seem to have any enchantment orbs for that equipment."; close; } mes .npc$; mes "Please, select an enchantment from the menu."; next; select([email protected]$); set [email protected], [email protected][@menu]; set [email protected]$, ""; set [email protected], 0; while((set([email protected],[email protected]+1)-1)<4) { setd("[email protected]"[email protected], getequipcardid([email protected]_loc,[email protected])); if(getequipcardid([email protected]_loc,[email protected])) set [email protected]$, [email protected][email protected]+.crd_c$[[email protected]]+" Slot- [^a92435"+getitemname(getequipcardid([email protected]_loc,[email protected]))+"^000000]:"; else set [email protected]$, [email protected][email protected]+.crd_c$[[email protected]]+" Slot- [^30ad25Empty^000000]:"; } mes .npc$; mes "Select a slot."; next; set([email protected],select([email protected]$)-1); set [email protected], getequiprefinerycnt([email protected]_loc); if(getequipcardid([email protected]_loc,[email protected])) { mes .npc$; mes "Would you like me to remove this card?"; next; if(select("Yes:No")&2) { mes .npc$; mes "Alright, thanks anyways!"; close; } getitem getequipcardid([email protected]_loc,[email protected]),1; delitem2 [email protected]_itm, 1, 1, [email protected], 0, [email protected], [email protected], [email protected], [email protected]; setd("[email protected]"+(@menu+1), 0); getitem2 [email protected]_itm, 1, 1, [email protected], 0, [email protected], [email protected], [email protected], [email protected]; } if(rand(101)>.perc[[email protected]]) { mes .npc$; mes "I'm sorry but I've failed you!"; misceffect 155; emotion e_sob,0; set Zeny,Zeny-.pric; close; } set Zeny,Zeny-.pric; delitem [email protected],1; delitem2 [email protected]_itm, 1, 1, [email protected], 0, [email protected], [email protected], [email protected], [email protected]; setd("[email protected]"+(@menu+1), [email protected]); getitem2 [email protected]_itm, 1, 1, [email protected], 0, [email protected], [email protected], [email protected], [email protected]; misceffect .efet; emotion e_no1,0; mes .npc$; mes "All done!"; equip [email protected]_itm; close; //NPC Constants OnInit: //=-=-=-=-=-=-=Configuration=-=-=-=-=-=-= set .npc$ , "[^0000FFEnchant Expert^000000]"; // NPC Name set .pric , 1000000; // Price set .efet , 154; // Effect Number setarray .perc , 100,80,50,10; // Percent slot setarray .crd_c$, "st", "nd", "rd", "th"; // Count setarray .itm32 , 4760; // Sheilds setarray .itm16 , 4761; // Armor setarray .itm4 , 4762; // Garment setarray .itm64 , 4763, 4764; // Footgear setarray .itm128 , 4765; // Accessory1 setarray .itm10 , 4766; // Accessory2 setarray .itm2 , 4765; // Weapon setarray .itm1 , 4766; // Low Headgear setarray .itm512 , 4767; // Mid Headgear setarray .itm256 , 4767; // Upper Headgear setarray .eqp$ , "Upper Headgear", "Mid Headgear", "Low Headgear", "Armor", "Left Hand", "Right Hand", "Garment", "Shoes", "Accessory1", "Accessory2"; setarray .equiploc, EQI_HEAD_TOP, EQI_HEAD_MID, EQI_HEAD_LOW, EQI_ARMOR, EQI_HAND_L, EQI_HAND_R, EQI_GARMENT, EQI_SHOES, EQI_ACC_L, EQI_ACC_R; set .e_len , getarraysize(.eqp$); //=-=-=-=-=-=-=-=-Skorm-=-=-=-=-=-=-=-=-= } Working version.