Jump to content

popochun

Members
  • Posts

    5
  • Joined

  • Last visited

Posts posted by popochun

  1. 16 hours ago, joecalis said:

    in status.cpp

    Find:

    		case SC_SIGNUMCRUCIS:
    			// Only affects demons and undead element (but not players)
    			if((!undead_flag && status->race!=RC_DEMON) || bl->type == BL_PC)
    				return 0;
    			break;

    Change To:

    		case SC_SIGNUMCRUCIS:
    			// Now affects all monsters (but not players)
    			if(bl->type == BL_PC)
    				return 0;
    			break;

     

    This is perfect! Thank you so much.

  2. As the title says, What I'm attempting is how do I go about changing Acolyte's skill Signum Crucis to reduce all monster's defense instead of just Undead's and Demon's? I am currently looking at a section of this skill in src/map/skill.cpp and I can't seem to find where exactly does it perform a check whether monsters on screen are Undead/Demon or not. If anyone could point me to the right direction I would greatly appreciate it. 

    Here's the snippet of where I think modification should be made (again, not sure if this is correct or not)

    case AL_CRUCIS:
    		if (flag&1)
    			sc_start(src,bl,type, 23+skill_lv*4 +status_get_lv(src) -status_get_lv(bl), skill_lv,skill_get_time(skill_id,skill_lv));
    		else {
    			map_foreachinallrange(skill_area_sub, src, skill_get_splash(skill_id, skill_lv), BL_CHAR,
    				src, skill_id, skill_lv, tick, flag|BCT_ENEMY|1, skill_castend_nodamage_id);
    			clif_skill_nodamage(src, bl, skill_id, skill_lv, 1);
    		}
    		break;

     

  3. Sorry I posted this in a wrong forum. Please feel free to delete this.

    As the title says, What I'm attempting is how do I go about changing Acolyte's skill Signum Crucis to reduce all monster's defense instead of just Undead's and Demon's? I am currently looking at a section of this skill in src/map/skill.cpp and I can't seem to find where exactly does it perform a check whether monsters on screen are Undead/Demon or not. If anyone could point me to the right direction I would greatly appreciate it. 

    Here's the snippet of where I think modification should be made (again, not sure if this is correct or not)

    	case AL_CRUCIS:
    		if (flag&1)
    			sc_start(src,bl,type, 23+skill_lv*4 +status_get_lv(src) -status_get_lv(bl), skill_lv,skill_get_time(skill_id,skill_lv));
    		else {
    			map_foreachinallrange(skill_area_sub, src, skill_get_splash(skill_id, skill_lv), BL_CHAR,
    				src, skill_id, skill_lv, tick, flag|BCT_ENEMY|1, skill_castend_nodamage_id);
    			clif_skill_nodamage(src, bl, skill_id, skill_lv, 1);
    		}
    		break;

     

  4. I have browsed around the forum and found the following threads.

    [Release+Guide] Common Ailment Status Icon [Unofficial] Extra Status Icons

    I followed the instruction detailed in those threads and found partial success ( server compiled and executed without any errors ). However the status icon still did not show up and I'm not sure what I missed. I'm hoping that someone might be able to point me to the right direction.

    Here's what I did

    Server-side:

    Status.hpp:

    add EFST_VIPSTATE before EFST_MAX

    /// @APIHOOK_END
    /// Do not modify code above this, since it will be automatically generated by the API again
    	EFST_VIPSTATE = 1500,
    	EFST_MAX,
    };

    add SC_VIPSTATE before SC_MAX

    	SC_VIPSTATE,
    	SC_MAX, //Automatically updated max, used in for's to check we are within bounds.
    };

    Status.cpp

    add the following line into initChangeTables function

    	StatusIconChangeTable[SC_VIPSTATE] = EFST_VIPSTATE;

     map/script_constants.hpp

    export script efst_vipstate constant 

    export_constant(EFST_VIPSTATE);

     

    Client Side:

    Create "custom.grf" and set itas the first index in DATA.INI

    add required files into data\luafiles\lua files\stateicon (efstids.lub, stateiconimginfop.lub, stateiconinfo.lub, stateiconinfo_f.lub)

    add vip status icon called  "VIP1.TGA" to data\texture\effect

    data\luafiles514\lua files\stateicon\efstids.lub:

    add EFST_VIPSTATE to the bottom like so:

    	EFST_REF_T_POTION = 1169,
    	EFST_ADD_ATK_DAMAGE = 1170,
    	EFST_ADD_MATK_DAMAGE = 1171,
    	EFST_VIPSTATE = 1500,
    	__newindex = function()
    	error("unknown state")
    end
    }

    data\luafiles514\lua files\stateicon\stateiconimginfo.lub:

    point EFST_VIPSTATE to the .tga file (in PRIORITY_WHITE section)

    		[EFST_IDs.EFST_AURABLADE] = "icon04.tga",
    		[EFST_IDs.EFST_HELLS_PLANT_ARMOR] = "hells_plant_armor.tga",
    		[EFST_IDs.EFST_VIPSTATE] = "VIP1.TGA"
    	}

    data\luafiles514\lua files\stateicon\stateiconinfo.lub:

    add description to the end of file

    StateIconList[EFST_IDs.EFST_VIPSTATE] = {
        descript = {
            {"VIP STATUS"}
        }
    }

     

    Testing

    To trigger vip: I use a usable item with the following script

    vip_time 60;

    To see vip status: I used the following script with on PC login event to display status in the chatbox and add effect/status effect to activate status icon.

    OnPcloginEvent:
    	bonus_script_clear EFST_VIPSTATE;
    	if(vip_status(1)) {
    		bonus_script "{}",99999999,0,0,EFST_VIPSTATE;
    		
    		dispbottom "TEST EFST_VIPSTATE" + EFST_VIPSTATE;
    		dispbottom "TEST EFST_MAX" + EFST_MAX;
    		//not quite needed yet
    		sc_start SC_VIPSTATE,-1,0;
    		set .@timer, vip_status(2);
    
    		dispbottom "--- VIP ----";
    		dispbottom "==========================";
    		dispbottom "VIP Player";
    		dispbottom Remaining VIP duration :"+callfunc("Time2Str",.@timer);
    		dispbottom "==========================";
    			end;
    		}
    }

     

    Result:

    - after using vip activation item and re-login nothing shows up

    - server was compiled/built/executed without any errors/warnings

    - VIP status icon did not show up on the sidebar at all (other buffs showed up fine)

     

    Any help would be appreciated!

     

     

    vip_didnot_show.PNG

    vip_icon.PNG

  5. On 5/6/2015 at 6:49 PM, EL Dragon said:

    here

    
    -	shop	ex_card_shop	-1,501:1000
    prontera,160,181,5	script	card_exchange	474,{
    	mes "[ Card Exchange ]";
    	mes "Give to me your old cards in exchange I'll give you OCA.";
    	mes "You currently have "+ex_cd_pts+" point(s).";
    	mes "Each card equals "+.points+" point(s).";
    	mes .limit+" point(s) will earn you "+.amount+" "+getitemname(.item)+"(s).";
    	callshop "ex_card_shop",2;
    	npcshopattach "ex_card_shop";
    	end;
    	
    OnSellItem:
    	for (.@i = 0; .@i < getarraysize(@sold_nameid); .@i++) {
    		if( getiteminfo( @sold_nameid[.@i], 2 ) != 6 ) {
    			dispbottom "I only accept cards.";
    			end;
    		}
    		if( .mvp ) {
    			.@str$ = substr( getitemname( @sold_nameid[.@i] ), 0, getstrlen( getitemname(@sold_nameid[.@i]) ) -6 );
    			query_sql ( "SELECT count(*) FROM `mob_db_re` WHERE `iName` LIKE '"+.@str$+"' AND `MEXP`;", .@count );
    			if( .@count ) {
    				dispbottom "I'm sorry but I don't accept mvp cards...";
    				end;
    			}
    		}
    		if( countitem( @sold_nameid[.@i] ) < @sold_quantity[.@i] ) {
    			dispbottom "Wth...?";
    			end;
    		}
    		delitem @sold_nameid[.@i], @sold_quantity[.@i];
    		ex_cd_pts = ex_cd_pts + ( @sold_quantity[.@i] * .points );
    		if( ex_cd_pts >= .limit ) {
    			ex_cd_pts = ex_cd_pts % .limit;
    			.@numbers = ex_cd_pts / .limit;
    			getitem .item, .@numbers * .amount;
    		}
    	}
    	end;
    	
    OnInit:
    	.mvp = 1; // Search and ignore mvp cards?
    	.points = 1; // Points per card.
    	.limit = 50; // The number of points required for ".item".
    	.item = 616; // Item you get for reaching ".limit".
    	.amount = 1; // The amount of ".item" you get per ".limit" reached.
    }

    or Putty

    
    //===== rAthena Script =======================================
    //= Card Trader
    //===== By: ==================================================
    //= Elias (og2)
    //===== Current Version: =====================================
    //= 1.4
    //===== Compatible With: =====================================
    //= rAthena SVN r15340+
    //===== Description: =========================================
    //= Card and Points Trader
    //===== Additional Comments: =================================
    //= v1.0 Translated from the Official [Elias]
    //= v1.1 Fixed variables and optimized script [Elias]
    //= v1.2 Fixed char being stuck with breaks [Elias] (bugreport:5374)
    //= v1.3 Optimized: reduced from 123kb to 7kb! [Euphy]
    //= v1.4 Variables don't need to load OnInit. [Euphy]
    //============================================================
    prt_vilg01,99,100,0 script Putty 90,{
    if (!.card[1]) {
      setarray .card1[0], 4001,4006,4009,4019,4075,4033,4012,4016,4026,4022,
    	 4027,4028,4038,4025,4021,4050,4079,4081,4090,4094,
    	 4101,4104,4110,4114,4119,4108,4095,4231,4280,4008,
    	 4011,4013,4014,4015,4020,4032,4037,4039,4041,4045,
    	 4046,4010,4023,4029,4052,4048,4056,4071,4093,4031,
    	 4036,4034,4042,4055,4061,4087,4096,4116,4122,4170,
    	 4215,4220,4228,4226,4212,4227,4267,4257,4278,4286,
    	 4287,4292,4311,4315,4319,4322,4084,4078,4113,4149,
    	 4153,4196,4240,4247,4256,4057,4066,4067,4112,4150,
    	 4152,4186,4187,4181,4173,4167,4162,4176,4195,4193,
    	 4200,4223,4194,4190,4189,4192,4224,4244,4248,4261,
    	 4260,4259,4274,4275,4313,4299,4304,4294,4076,4127,
    	 4154,4157,4156,4213,4214,4225,4235;
      setarray .card2[0], 4293,4297,4288,4283,4295,4307,4308,4309,4132,4326,
    	 4341,4335,4337,4345,4344,4331,4333,4332,4089,4161,
    	 4177,4178,4180,4184,4191,4206,4199,4273,4282,4268,
    	 4289,4321,4316,4343,4339,4369,4377,4385,4383,4382,
    	 4380,4381,4378,4379,4390,4389,4388,4391,4405,4400,
    	 4401,4402,4404,4002,4003,4004,4005,4007,4017,4024,
    	 4030,4035,4040,4043,4044,4049,4051,4053,4058,4060,
    	 4062,4063,4064,4065,4068,4069,4070,4072,4073,4074,
    	 4077,4080,4082,4083,4085,4086,4088,4091,4092,4097,
    	 4098,4099,4100,4102,4103,4106,4107,4109,4111,4115,
    	 4117,4118,4120,4124,4125,4126,4138,4139,4141,4151,
    	 4158,4164,4165,4182,4185,4159,4160,4166,4172,4175,
    	 4188,4201,4202,4204,4205,4208,4209;
      setarray .card3[0], 4120,4216,4217,4219,4221,4222,4230,4234,4233,4232,
    	 4237,4238,4242,4243,4245,4246,4249,4252,4255,4258,
    	 4262,4264,4276,4270,4271,4218,4239,4251,4253,4269,
    	 4334,4105,4133,4136,4229,4272,4277,4279,4281,4284,
    	 4285,4290,4296,4298,4301,4310,4314,4317,4325,4327,
    	 4328,4329,4338,4340,4346,4347,4348,4349,4350,4351,
    	 4353,4354,4355,4356,4358,4360,4362,4364,4366,4368,
    	 4370,4371,4373,4375,4387,4406,4129,4155,4291,4392,
    	 4393,4394,4409,4410,4411,4412,4413,4414,4415,4416,
    	 4417,4418,4420,4421,4422,4423,4424,4427,4427,4428,
    	 4429,4431,4432,4433,4434,4435,4436,4437,4438,4439,
    	 4440,4442,4443,4444,4445,4447,4448,4449,4450,4452,
    	 4453;
      setarray .card[1],  getarraysize(.card1), getarraysize(.card2), getarraysize(.card3);
    }
    set .@points,oversea_event9;
    if (!.@points) {
      mes "[Putty]";
      mes "Hi there.";
      mes "I don't know if I can be";
      mes "of any assistance, but I";
      mes "am trying to help older veterans";
      mes "by exchaning the cards that";
      mes "they are no longer using.";
      next;
      switch(select("Ask for more information!","I don't have any cards right now.")) {
       case 1:
        mes "[Putty]";
        mes "I am giving 1 point for each card that you bring me.";
        mes "The points can be used to exchange for items that I have.";
        next;
        mes "[Putty]";
        mes "For ^CC0000100 points^000000: ^0000CC1 Old Card Album^000000.";
        mes "For ^CC000050 points^000000: ^0000CC20 Yggdrasil Berry^000000.";
        mes "For ^CC000020 points^000000: ^0000CC10 Blue Potion^000000.";
        mes "For ^CC00001 point^000000: ^0000CC4 Honey^000000.";
        next;
       break;
       case 2:
        mes "[Putty]";
        mes "Well, remember this offer!";
        close;
       break;
      }
    } else {
      mes "[Putty]";
      mes "Welcome back!";
      mes "I see you already have some";
      mes "trading points. Actually, you currently have ^00cc00" + .@points + "^000000.";
      next;
      mes "[Putty]";
      mes "Would you like to exchange these";
      mes "points now, or you would like to exchange more cards?";
      next;
    }
    switch(select("I would like to exchange cards.","Can I exchange the points?")) {
      case 1:
       mes "[Putty]";
       mes "Please tell me what card you want to exchange.";
       next;
       input .@i$;
       set .@input$, "_"+.@i$;
       set .@card,0;
       //freeloop(1);
       for(set .@j,1; .@j<4; set .@j,.@j+1) {
        for(set .@i,0; .@i<.card[.@j]; set .@i,.@i+1)
    	 if (compare(.@input$,"_"+getitemname(getd(".card"+.@j+"["+.@i+"]")))) {
    	  set .@card, getd(".card"+.@j+"["+.@i+"]"); break; }
        sleep2 10; // For good measure
        if (.@card) break; }
       //freeloop(0);
       mes "[Putty]";
       if (!.@card) mes "Please, come back here if you want to exchange a monster card.";
       else {
        set .@count, countitem(.@card);
        if (!.@count) {
    	 mes "You don't have any ^0055FF"+getitemname(.@card)+"s^000000 with you!";
    	 close; }
        mes "You've got ^0055FF"+.@count+" "+getitemname(.@card)+((.@count>1)?"s":"")+"^000000.";
        mes " ";
        mes "Would you like to exchange 1 point for each of them?";
        next;
        switch(select("Yes, please!","No, thank you.")) {
    	 case 1:
    	  delitem .@card,.@count;
    	  set oversea_event9, (.@points+.@count);
    	  mes "[Putty]";
    	  mes "Alright, you have received ^CC0000"+.@count+"^000000 points.";
    	  break;
    	 case 2:
    	  mes "[Putty]";
    	  mes "Okay, let me know if I can help you with something else.";
    	  break;
        }
       }
       close;
      case 2:
       if (.@points) {
        mes "[Putty]";
        mes "These are the items that I have.";
        next;
        switch(select("1 Old Card Album - 50 Points","20 Yggdrasil Berry - 50 Points","10 Blue Potion - 20 Points","4 Honey - 1 Point","^777777Nerver mind.^000000")) {
    	 case 1:
    	  if (.@points < 100) break;
    	  mes "[Putty]";
    	  mes "Great, I wish you the best";
    	  mes "of luck with this album. I have a";
    	  mes "very good feeling about this one!";
    	  set oversea_event9, .@points - 100;
    	  getitem 616,1;
    	  close;
    	 case 2:
    	  if (.@points < 50) break;
    	  mes "[Putty]";
    	  mes "Oh, you must like adventures.";
    	  mes "Here you go, just what you need!";
    	  set oversea_event9, .@points - 50;
    	  getitem 607,20;
    	  close;
    	 case 3:
    	  if (.@points < 20) break;
    	  mes "[Putty]";
    	  mes "Blue Potions? Are you sure?";
    	  mes "If that's what you want, here they are!";
    	  set oversea_event9, .@points - 20;
    	  getitem 505,10;
    	  close;
    	 case 4:
    	  if (.@points < 1) break;
    	  mes "[Putty]";
    	  mes "It took many bees";
    	  mes "to make all of this.";
    	  mes "Make good use of it.";
    	  set oversea_event9, .@points - 1;
    	  getitem 518,4;
    	  close;
    	 case 5:
    	  mes "[Putty]";
    	  mes "Alright, come back when you have more points.";
    	  close;
    	 }
        mes "[Putty]";
        mes "Sorry, but you don't have enough points.";
        close;
       } else {
        mes "[Putty]";
        mes "You have 0 points. You need at least 1 point to exchange.";
       }
      break;
      }
    close;
    }

     

    Came a cross this post and checked  the code. There's a minor bug in your first code segment.

    .@numbers = ex_cd_pts / .limit;

    must comes before 

    ex_cd_pts = ex_cd_pts % .limit;
    Otherwise this is working great! nice job and thanks for the script!

     

×
×
  • Create New...