Jump to content

AnnieRuru

Members
  • Posts

    2044
  • Joined

  • Last visited

  • Days Won

    51

Posts posted by AnnieRuru

  1. I know about the Tarot Card of Fate event script
    but its too similar to Roulette script isn't it ?

    you just sit there AFK, and just wait for the npc to cast the skill effect on you
    its a very boring event

    and when I made the Russian Roulette script, I couldn't exactly make it happen having a last survivor at 3 rounds
    the npc just randomly shot someone dead in 1/6 chance

    Tarot Card of Fate have 14 cards, but only 3 of them dealing damage - The Chariot , The Devil, The Tower,
    not exactly killing them either

  2. no more edit ? ok time to reply this topic

     

    On 2/21/2019 at 3:29 PM, Seravy said:

    I tried your treasure spawn change but it doesn't work. I want the treasure to spawn at the time I break the emperium, exactly once, and never again, until the monsters retake the castle and I clean it out again. "onClock0001" seems to be "do this at midnight" if I understand correctly, so instead, I need the treasure spawn to be turned into a function, which I can call from where the emperium is broken I believe. I'll update this post when there is more progress, it shouldn't be too hard to figure out the correct syntax for that.  Couldn't figure out how to make it a procedure but copying the treasure spawn script as is to where the emperium breaks works. I only need it to be executed then, so it doesn't really need to be a procedure. Also removed the onClock0001 line, that should be enough to disable daily respawns. So this is now also solved.

    Emperium is spawn by *monster script command, the event label indicate the execution of the specific label
    in WOE:FE is OnAgitBreak, so just add donpcevent to the custom label that you have changed from OnClock0001:

     

     

    On 2/21/2019 at 3:29 PM, Seravy said:

    Looks like the castle can be conquered from monsters when WOE is off anyway, so I removed the activation timer file and added nothing to replace it.

    castle can be conquered when there are no owner, and that's official
    so for example, if the guild owns a guild castle and disband the guild, other guild can immediately rush into the castle can claim ownership right away

     

     

    On 2/21/2019 at 3:29 PM, Seravy said:

    Somewhat confused on the monster level thing. Do I need to raise monster stats separately, or does raising the level automatically adjust all their stats as if the monster leveled up? (How much stats do monsters gain from leveling anyway, never played with monster level up enabled...)

    custom stuff, monster do not level up officially
    however there is a custom mod, which already in the repo

    conf/battle/monster.conf

    // Monsters level up (monster will level up each time a player is killed and they will grow stronger)
    // Exp rate is calculated ((monster level-original monster level)*(exp*(mobs_level_up_exp rate/100)))
    // NOTE: Does not apply to WoE Guardians.
    mobs_level_up: no
    mobs_level_up_exp_rate: 1

    reading the code, it seems only give extra experience gain for the player ... though

    if you want to make monster tougher, maybe you can play around with this

     

     

    On 2/21/2019 at 3:29 PM, Seravy said:

    ...maybe I'll scale the type and quantity of mobs instead of their level and stats, idk, might be a better solution. I guess I'll experiment with it and see for myself how it works. Ok, testing shows changing monster level doesn't make it stronger. So I have to change the stats as well if I want them to grow stronger. Okay, not entirely sure what stats need to be changed. there is MINATK, MAXATK, MINMATK MAXMATK but that doesn't make sense to me. These are values calculated from base stats, aren't they? I'm completely unsure which of these I need to modify... I mean a monster only has one atk and one matk stat in the database. Min and max are calculated... (although matk is mislabeled as maxatk but that bug was already fixed in that recent update...)

    exactly

    and you long long post about batk/watk/matk stuff,
    just forget about it, this renewal and pre-renewal stuff actually break it,
    a similar question also pop up in hercules, I also dunno how to solve it
    http://herc.ws/board/topic/16580-how-to-make-matk-1-in-status_calc_pc_/

    anyway, change the base stats first, then its custom calculation comes later

    prontera,155,185,5	script	skdfjhsfkj	1_F_MARIA,{
    	monster "this",-1,-1, "--ja--",1002,1, "";
    	// change the base stat 1st
    	setunitdata $@mobid, UMOB_STR, 200;
    	setunitdata $@mobid, UMOB_DEX, 200;
    	setunitdata $@mobid, UMOB_INT, 200;
    	setunitdata $@mobid, UMOB_LUK, 200;
    	setunitdata $@mobid, UMOB_AGI, 200;
    	setunitdata $@mobid, UMOB_VIT, 200;
    	// change the calculation later
    	setunitdata $@mobid, UMOB_MAXHP, 10000000;
    	setunitdata $@mobid, UMOB_HP, 10000000;
    	setunitdata $@mobid, UMOB_ATKMIN, 1;
    	setunitdata $@mobid, UMOB_ATKMAX, 1;
    	setunitdata $@mobid, UMOB_HIT, 1000;
    	end;
    }

     

     

     

    On 2/21/2019 at 3:29 PM, Seravy said:

    WOE+WOE SE+WOE TE total 40 castles but server says "loaded 44 castles" at startup, what are the last 4?

    novice castles
    https://github.com/rathena/rathena/blob/master/db/castle_db.txt#L35-L38

    you can make your own woe castle script btw
    https://annieruru.blogspot.com/2019/01/how-to-create-your-own-woe-castle-map.html

  3. you have 3 topics about 3rd class ...

    prontera,147,174,5	script	Change Dress	509,{
    	mes "[Armando]";
    	if ( !(eaclass() & EAJL_THIRD) || BaseJob == Job_SuperNovice ) {
    		mes "I'm sorry, but you do not have 3rd class.";
    		close;
    	}
    	mes "Hi "+strcharinfo(0)+" do you want to change your dress?";
    	next;
    	if ( prompt( "Primary Dress", "Second Dress" ) == 255 ) {
    		mes "[Kasondra]"; // why keep changing name ?
    		mes "Goodbye.";
    		close;
    	}
    	setlook LOOK_BODY2, @menu -1;
    	mes "Done!";
    	close;
    }

     

  4. 8 hours ago, jeyner said:

    Hello.

    I want to know if is possible to change an item description on server-side. For example, that some script will change the ATK of certain weapon.

    Thanks.

    Random option is entirely server side

    prontera,155,185,5	script	skjhsdfkj	1_F_MARIA,{
    	setarray .@OptID[0],RDMOPT_VAR_ATTPOWER;
    	setarray .@OptVal[0],10;
    	setarray .@OptParam[0],0;
    	getitem3 1501, 1,1,0,0, 0,0,0,0, .@OptID,.@OptVal,.@OptParam;
    	setarray .@OptVal[0],100;
    	getitem3 1501, 1,1,0,0, 0,0,0,0, .@OptID,.@OptVal,.@OptParam;
    	setarray .@OptVal[0],1000;
    	getitem3 1501, 1,1,0,0, 0,0,0,0, .@OptID,.@OptVal,.@OptParam;
    	end;
    }

    screen2019rAthena012.jpg

    the ATK+100 is manipulable

    • Upvote 1
  5. I already lost count how many times I have been using getinventorylist this month ...

    function	script	F_MesItemInfo	{
    	.@item = getarg(0);
    	.@itemname$ = getitemname(.@item);
    	if (.@itemname$ == "null")
    		.@itemname$ = "Unknown Item";
    	if (PACKETVER >= 20150729)
    		return sprintf("<ITEM>%s<INFO>%d</INFO></ITEM>", .@itemname$, .@item);
    	else if (PACKETVER >= 20130130)
    		return sprintf("<ITEMLINK>%s<INFO>%d</INFO></ITEMLINK>", .@itemname$, .@item);
    	else
    		return .@itemname$;
    }
    
    prontera,155,185,5	script	jdshfjsdfh	1_F_MARIA,{
    	getinventorylist;
    	for ( .@i = 0; .@i < @inventorylist_count; ++.@i ) {
    		if ( inarray(.itemlist, @inventorylist_id[.@i] ) >= 0 ) {
    			.@itemid[.@c++] = @inventorylist_id[.@i];
    			.@menu$ += getitemname( @inventorylist_id[.@i] ) +":";
    		}
    	}
    	if ( !.@c ) {
    		mes "You don't have any ticket on you";
    		close;
    	}
    	.@s = select( .@menu$ ) -1;
    	mes "You have selected "+ F_MesItemInfo(.@itemid[.@s]);
    	close;
    OnInit:
    	setarray .itemlist, 909,910,911,912,
    		34993,34994,34995,34996;
    	end;
    }

     

    • Upvote 1
  6.  src/map/skill.cpp | 4 ++--
     1 file changed, 2 insertions(+), 2 deletions(-)
    
    diff --git a/src/map/skill.cpp b/src/map/skill.cpp
    index 1864faeec..92a79e3e9 100755
    --- a/src/map/skill.cpp
    +++ b/src/map/skill.cpp
    @@ -18026,8 +18026,8 @@ struct skill_unit *skill_initunit(struct skill_unit_group *group, int idx, int x
     	// Perform oninit actions
     	switch (group->skill_id) {
     		case WZ_ICEWALL:
    -			map_setgatcell(unit->bl.m,unit->bl.x,unit->bl.y,5);
    -			clif_changemapcell(0,unit->bl.m,unit->bl.x,unit->bl.y,5,AREA);
    +			map_setgatcell(unit->bl.m,unit->bl.x,unit->bl.y,1);
    +			clif_changemapcell(0,unit->bl.m,unit->bl.x,unit->bl.y,1,AREA);
     			skill_unitsetmapcell(unit,WZ_ICEWALL,group->skill_lv,CELL_ICEWALL,true);
     			break;
     		case SA_LANDPROTECTOR:

    answer is change gat type 5 into gat type 1

    because the map_get2cell function say so .. in src\map\map.cpp

    // gat system
    inline static struct mapcell map_gat2cell(int gat) {
    	struct mapcell cell;
    
    	memset(&cell,0,sizeof(struct mapcell));
    
    	switch( gat ) {
    		case 0: cell.walkable = 1; cell.shootable = 1; cell.water = 0; break; // walkable ground
    		case 1: cell.walkable = 0; cell.shootable = 0; cell.water = 0; break; // non-walkable ground
    		case 2: cell.walkable = 1; cell.shootable = 1; cell.water = 0; break; // ???
    		case 3: cell.walkable = 1; cell.shootable = 1; cell.water = 1; break; // walkable water
    		case 4: cell.walkable = 1; cell.shootable = 1; cell.water = 0; break; // ???
    		case 5: cell.walkable = 0; cell.shootable = 1; cell.water = 0; break; // gap (snipable)
    		case 6: cell.walkable = 1; cell.shootable = 1; cell.water = 0; break; // ???
    		default:
    			ShowWarning("map_gat2cell: unrecognized gat type '%d'\n", gat);
    			break;
    	}
    
    	return cell;
    }

     

    • Love 1
  7. 100% scripting
    btw scripting is my absolute strong point

    4 hours ago, Seravy said:

    -Every X hours (while the server is turned on) there is a chance for each owned castle to be retaken by monsters, or if it's already owned by monsters, chance to lose an investment level.

    https://irowiki.org/wiki/War_of_Emperium#Benefits

    -	script	ksdjfs	FAKE_NPC,{
    OnMinute00:
    	for ( .@i = 0; .@i < 20; ++.@i ) {
    		if ( getcastledata( .castle$[.@i], CD_GUILD_ID ) ) {
    			if ( rand(100) < 50 ) { // 50% chance
    				setcastledata .castle$[.@i], CD_GUILD_ID, 0;
    				donpcevent "Agit#"+ .castle$[.@i] +"::OnStartArena";
    			}
    		}
    		else {
    			if ( rand(100) < 50 ) // 50% chance
    				setcastledata .castle$[.@i], CD_CURRENT_ECONOMY, getcastledata( .castle$[.@i], CD_CURRENT_ECONOMY ) - 5;
    		}
    	}
    	end;
    OnInit:
    	setarray .castle$[0],
    		"aldeg_cas01","aldeg_cas02","aldeg_cas03","aldeg_cas04","aldeg_cas05",
    		"gefg_cas01","gefg_cas02","gefg_cas03","gefg_cas04","gefg_cas05",
    		"payg_cas01","payg_cas02","payg_cas03","payg_cas04","payg_cas05",
    		"prtg_cas01","prtg_cas02","prtg_cas03","prtg_cas04","prtg_cas05";
    	end;
    }

     

     

    4 hours ago, Seravy said:

    -Treasure does not respawn except after the castle is taken from the monsters ....

     npc/guild/agit_main.txt | 4 ++--
     1 file changed, 2 insertions(+), 2 deletions(-)
    
    diff --git a/npc/guild/agit_main.txt b/npc/guild/agit_main.txt
    index c2925487c..964e701fb 100644
    --- a/npc/guild/agit_main.txt
    +++ b/npc/guild/agit_main.txt
    @@ -1135,8 +1135,8 @@ OnClock0001:
     	
     	set .@GID, GetCastleData(strnpcinfo(2),CD_GUILD_ID);
     	
    -	// If there is no owner, do nothing.
    -	if (!.@GID) end;
    +	// only spawn treasure chest when there is no owner
    +	if (.@GID) end;
     
     	// Is there Economy in this castle?
     	set .@Treasure,GetCastleData(strnpcinfo(2),CD_CURRENT_ECONOMY)/5+4;

     

     

    4 hours ago, Seravy said:

    ... and you can invest only once.

     npc/guild/agit_main.txt | 10 +++-------
     1 file changed, 3 insertions(+), 7 deletions(-)
    
    diff --git a/npc/guild/agit_main.txt b/npc/guild/agit_main.txt
    index c2925487c..abe5c3cda 100644
    --- a/npc/guild/agit_main.txt
    +++ b/npc/guild/agit_main.txt
    @@ -657,22 +657,18 @@ OnRecvCastle:
     		else if ((.@Economy >= 86) && (.@Economy <= 90)) { set .@eco_invest,770000; }
     		else if ((.@Economy >= 91) && (.@Economy <= 95)) { set .@eco_invest,860000; }
     		else if ((.@Economy >= 96) && (.@Economy <= 100)) { set .@eco_invest,955000; }
    -		//Quadruple the cost of investing if you've already invested once.
    -		if (GetCastleData(strnpcinfo(2),CD_INVESTED_ECONOMY)) {
    -			set .@eco_invest,.@eco_invest*4;
    -		}
     		mes "["+strnpcinfo(1)+"]";
     		mes "If you invest in commercial growth, the quantity of goods made by the guild will increase. Therfore, if you consider our future, investments will be a necessity.";
     		mes " ";
    -		mes "Initially, you are able to invest just once but if you pay more money, you will be able to invest twice.";
    +		mes "You are able to invest just once.";
     		if (.@Economy >= 100) {
     			mes " ";
     			mes "^ff0000The commercial growth level of our Castle is at it's highest, 100%. No more investments are needed. Just as I have expected from a great economist like you, Master.^000000";
     			close;
     		}
    -		if (GetCastleData(strnpcinfo(2),CD_INVESTED_ECONOMY) >= 2) {
    +		if (GetCastleData(strnpcinfo(2),CD_INVESTED_ECONOMY) >= 1) {
     			mes " ";
    -			mes "^ff0000You have already invested twice today. You cannot invest any more.^000000 I expect riches of the guild to grow at a high rate.";
    +			mes "^ff0000You have already invested today. You cannot invest any more.^000000 I expect riches of the guild to grow at a high rate.";
     			close;
     		}
     		if (GetCastleData(strnpcinfo(2),CD_INVESTED_ECONOMY) == 0) {

     

     

    4 hours ago, Seravy said:

    -Monsters grow stronger the more investment levels there are so each time it's harder to retake the castle (but higher investment means more treasure chest as usual)

     npc/guild/agit_main.txt | 40 ++++++++++++++++++++++++++++++++++++++++
     1 file changed, 40 insertions(+)
    
    diff --git a/npc/guild/agit_main.txt b/npc/guild/agit_main.txt
    index c2925487c..fd76a0582 100644
    --- a/npc/guild/agit_main.txt
    +++ b/npc/guild/agit_main.txt
    @@ -177,17 +177,57 @@ OnRecvCastle:
     		if (compare(strnpcinfo(2),"aldeg")) {
     			// Normal Spawns
     			monster strnpcinfo(2),0,0,"Evil Druid",1117,10;
    +			for ( .@i = 0; .@i < 10; ++.@i ) {
    +				setunitdata $@mobid[.@i], UMOB_MAXHP, getmonsterinfo( 1117, MOB_MAXHP ) * getcastledata( strnpcinfo(2), CD_CURRENT_ECONOMY ) / 100; 
    +				setunitdata $@mobid[.@i], UMOB_HP, getmonsterinfo( 1117, MOB_MAXHP ) * getcastledata( strnpcinfo(2), CD_CURRENT_ECONOMY ) / 100;	
    +			}
     			monster strnpcinfo(2),0,0,"Khalitzburg",1132,4;
    +			for ( .@i = 0; .@i < 4; ++.@i ) {
    +				setunitdata $@mobid[.@i], UMOB_MAXHP, getmonsterinfo( 1132, MOB_MAXHP ) * getcastledata( strnpcinfo(2), CD_CURRENT_ECONOMY ) / 100; 
    +				setunitdata $@mobid[.@i], UMOB_HP, getmonsterinfo( 1132, MOB_MAXHP ) * getcastledata( strnpcinfo(2), CD_CURRENT_ECONOMY ) / 100;	
    +			}
     			monster strnpcinfo(2),0,0,"Abysmal Knight",1219,2;
    +			for ( .@i = 0; .@i < 2; ++.@i ) {
    +				setunitdata $@mobid[.@i], UMOB_MAXHP, getmonsterinfo( 1219, MOB_MAXHP ) * getcastledata( strnpcinfo(2), CD_CURRENT_ECONOMY ) / 100; 
    +				setunitdata $@mobid[.@i], UMOB_HP, getmonsterinfo( 1219, MOB_MAXHP ) * getcastledata( strnpcinfo(2), CD_CURRENT_ECONOMY ) / 100;	
    +			}
     			monster strnpcinfo(2),0,0,"Executioner",1205,1;
    +				setunitdata $@mobid[.@i], UMOB_MAXHP, getmonsterinfo( 1205, MOB_MAXHP ) * getcastledata( strnpcinfo(2), CD_CURRENT_ECONOMY ) / 100; 
    +				setunitdata $@mobid[.@i], UMOB_HP, getmonsterinfo( 1205, MOB_MAXHP ) * getcastledata( strnpcinfo(2), CD_CURRENT_ECONOMY ) / 100;
     			monster strnpcinfo(2),0,0,"Penomena",1216,10;
    +			for ( .@i = 0; .@i < 10; ++.@i ) {
    +				setunitdata $@mobid[.@i], UMOB_MAXHP, getmonsterinfo( 1216, MOB_MAXHP ) * getcastledata( strnpcinfo(2), CD_CURRENT_ECONOMY ) / 100; 
    +				setunitdata $@mobid[.@i], UMOB_HP, getmonsterinfo( 1216, MOB_MAXHP ) * getcastledata( strnpcinfo(2), CD_CURRENT_ECONOMY ) / 100;	
    +			}
     			monster strnpcinfo(2),0,0,"Alarm",1193,18;
    +			for ( .@i = 0; .@i < 18; ++.@i ) {
    +				setunitdata $@mobid[.@i], UMOB_MAXHP, getmonsterinfo( 1193, MOB_MAXHP ) * getcastledata( strnpcinfo(2), CD_CURRENT_ECONOMY ) / 100; 
    +				setunitdata $@mobid[.@i], UMOB_HP, getmonsterinfo( 1193, MOB_MAXHP ) * getcastledata( strnpcinfo(2), CD_CURRENT_ECONOMY ) / 100;	
    +			}
     			monster strnpcinfo(2),0,0,"Clock",1269,9;
    +			for ( .@i = 0; .@i < 9; ++.@i ) {
    +				setunitdata $@mobid[.@i], UMOB_MAXHP, getmonsterinfo( 1269, MOB_MAXHP ) * getcastledata( strnpcinfo(2), CD_CURRENT_ECONOMY ) / 100; 
    +				setunitdata $@mobid[.@i], UMOB_HP, getmonsterinfo( 1269, MOB_MAXHP ) * getcastledata( strnpcinfo(2), CD_CURRENT_ECONOMY ) / 100;	
    +			}
     			monster strnpcinfo(2),0,0,"Raydric Archer",1276,7;
    +			for ( .@i = 0; .@i < 7; ++.@i ) {
    +				setunitdata $@mobid[.@i], UMOB_MAXHP, getmonsterinfo( 1276, MOB_MAXHP ) * getcastledata( strnpcinfo(2), CD_CURRENT_ECONOMY ) / 100; 
    +				setunitdata $@mobid[.@i], UMOB_HP, getmonsterinfo( 1276, MOB_MAXHP ) * getcastledata( strnpcinfo(2), CD_CURRENT_ECONOMY ) / 100;	
    +			}
     			monster strnpcinfo(2),0,0,"Wanderer",1208,3;
    +			for ( .@i = 0; .@i < 3; ++.@i ) {
    +				setunitdata $@mobid[.@i], UMOB_MAXHP, getmonsterinfo( 1208, MOB_MAXHP ) * getcastledata( strnpcinfo(2), CD_CURRENT_ECONOMY ) / 100; 
    +				setunitdata $@mobid[.@i], UMOB_HP, getmonsterinfo( 1208, MOB_MAXHP ) * getcastledata( strnpcinfo(2), CD_CURRENT_ECONOMY ) / 100;	
    +			}
     			monster strnpcinfo(2),0,0,"Alice",1275,1;
    +				setunitdata $@mobid[.@i], UMOB_MAXHP, getmonsterinfo( 1275, MOB_MAXHP ) * getcastledata( strnpcinfo(2), CD_CURRENT_ECONOMY ) / 100; 
    +				setunitdata $@mobid[.@i], UMOB_HP, getmonsterinfo( 1275, MOB_MAXHP ) * getcastledata( strnpcinfo(2), CD_CURRENT_ECONOMY ) / 100;
     			monster strnpcinfo(2),0,0,"Bloody Knight",1268,1;
    +				setunitdata $@mobid[.@i], UMOB_MAXHP, getmonsterinfo( 1268, MOB_MAXHP ) * getcastledata( strnpcinfo(2), CD_CURRENT_ECONOMY ) / 100; 
    +				setunitdata $@mobid[.@i], UMOB_HP, getmonsterinfo( 1268, MOB_MAXHP ) * getcastledata( strnpcinfo(2), CD_CURRENT_ECONOMY ) / 100;
     			monster strnpcinfo(2),0,0,"Dark Lord",1272,1;
    +				setunitdata $@mobid[.@i], UMOB_MAXHP, getmonsterinfo( 1272, MOB_MAXHP ) * getcastledata( strnpcinfo(2), CD_CURRENT_ECONOMY ) / 100; 
    +				setunitdata $@mobid[.@i], UMOB_HP, getmonsterinfo( 1272, MOB_MAXHP ) * getcastledata( strnpcinfo(2), CD_CURRENT_ECONOMY ) / 100;
     			// Set Emperium room spawn coordinates and spawn monsters.
     			if (strnpcinfo(2) == "aldeg_cas01") { setarray .@emproom[0],216,23; }
     			else if (strnpcinfo(2) == "aldeg_cas02") { setarray .@emproom[0],213,23; }

    lazy to do the rest ... anyway you get the point

     

     

    4 hours ago, Seravy said:

    -Woe is always enabled so I can take the castles from the monsters whenever I feel like doing it.

    disable the npc/guild/agit_controller.txt file and use this

    -	script	ksdjfs	FAKE_NPC,{
    OnInit:
    	agitstart;
    	end;
    }

     

     

    4 hours ago, Seravy said:

    Also, no idea how the guardians could be incorporated into this system, if at all, might be better to get rid of them.

     npc/guild/agit_main.txt | 2 ++
     1 file changed, 2 insertions(+)
    
    diff --git a/npc/guild/agit_main.txt b/npc/guild/agit_main.txt
    index c2925487c..d979649fa 100644
    --- a/npc/guild/agit_main.txt
    +++ b/npc/guild/agit_main.txt
    @@ -769,6 +769,8 @@ OnRecvCastle:
     		}
     	case 4:
     		mes "["+strnpcinfo(1)+"]";
    +		mes "Summon a Guardian is disabled";
    +		close;
     		mes "Will you summon a Guardian? It'll be a protector to defend us loyally.";
     		mes "Please select a guardian to defend us.";
     		next;

     

     

    4 hours ago, Seravy said:

    How difficult/possible it is do this? Is it as easy as changing some scripts or is it harder?

    for me, it is easy as 1 2 3 , A B C

     

     

    4 hours ago, Seravy said:

    Is it even possible to change the level of the monsters spawned?

     npc/guild/agit_main.txt | 28 ++++++++++++++++++++++++++++
     1 file changed, 28 insertions(+)
    
    diff --git a/npc/guild/agit_main.txt b/npc/guild/agit_main.txt
    index c2925487c..133012e87 100644
    --- a/npc/guild/agit_main.txt
    +++ b/npc/guild/agit_main.txt
    @@ -177,17 +177,45 @@ OnRecvCastle:
     		if (compare(strnpcinfo(2),"aldeg")) {
     			// Normal Spawns
     			monster strnpcinfo(2),0,0,"Evil Druid",1117,10;
    +			for ( .@i = 0; .@i < 10; ++.@i ) {
    +				setunitdata $@mobid[.@i], UMOB_LEVEL, 99;
    +			}
     			monster strnpcinfo(2),0,0,"Khalitzburg",1132,4;
    +			for ( .@i = 0; .@i < 4; ++.@i ) {
    +				setunitdata $@mobid[.@i], UMOB_LEVEL, 99;
    +			}
     			monster strnpcinfo(2),0,0,"Abysmal Knight",1219,2;
    +			for ( .@i = 0; .@i < 2; ++.@i ) {
    +				setunitdata $@mobid[.@i], UMOB_LEVEL, 99;
    +			}
     			monster strnpcinfo(2),0,0,"Executioner",1205,1;
    +				setunitdata $@mobid[.@i], UMOB_LEVEL, 99;
     			monster strnpcinfo(2),0,0,"Penomena",1216,10;
    +			for ( .@i = 0; .@i < 10; ++.@i ) {
    +				setunitdata $@mobid[.@i], UMOB_LEVEL, 99;
    +			}
     			monster strnpcinfo(2),0,0,"Alarm",1193,18;
    +			for ( .@i = 0; .@i < 18; ++.@i ) {
    +				setunitdata $@mobid[.@i], UMOB_LEVEL, 99;
    +			}
     			monster strnpcinfo(2),0,0,"Clock",1269,9;
    +			for ( .@i = 0; .@i < 9; ++.@i ) {
    +				setunitdata $@mobid[.@i], UMOB_LEVEL, 99;
    +			}
     			monster strnpcinfo(2),0,0,"Raydric Archer",1276,7;
    +			for ( .@i = 0; .@i < 7; ++.@i ) {
    +				setunitdata $@mobid[.@i], UMOB_LEVEL, 99;	
    +			}
     			monster strnpcinfo(2),0,0,"Wanderer",1208,3;
    +			for ( .@i = 0; .@i < 3; ++.@i ) {
    +				setunitdata $@mobid[.@i], UMOB_LEVEL, 99;
    +			}
     			monster strnpcinfo(2),0,0,"Alice",1275,1;
    +				setunitdata $@mobid[.@i], UMOB_LEVEL, 99;
     			monster strnpcinfo(2),0,0,"Bloody Knight",1268,1;
    +				setunitdata $@mobid[.@i], UMOB_LEVEL, 99;
     			monster strnpcinfo(2),0,0,"Dark Lord",1272,1;
    +				setunitdata $@mobid[.@i], UMOB_LEVEL, 99;
     			// Set Emperium room spawn coordinates and spawn monsters.
     			if (strnpcinfo(2) == "aldeg_cas01") { setarray .@emproom[0],216,23; }
     			else if (strnpcinfo(2) == "aldeg_cas02") { setarray .@emproom[0],213,23; }

    change all monsters to level 99

     

     

    4 hours ago, Seravy said:

    Do Woe SE castles work the same way as normal castles regarding monsters/chests/investing zeny, so can the same be done for them?

    yes,
    1. it happens to be using agitstart2 ...
    2. use npc\guild2 folder ...
    3. rathena also has woe training edition ...

     

     

    btw you ask too many question at once

    • Love 3
  8. apparently, just have to apply that line AFTER the guild_payexp and pc_calcexp function ... fixed

     src/map/pc.cpp | 7 +++++++
     1 file changed, 7 insertions(+)
    
    diff --git a/src/map/pc.cpp b/src/map/pc.cpp
    index 5aace7ecb..4fb097b61 100755
    --- a/src/map/pc.cpp
    +++ b/src/map/pc.cpp
    @@ -6719,6 +6719,13 @@ void pc_gainexp(struct map_session_data *sd, struct block_list *src, unsigned in
     	if (!(exp_flag&2))
     		pc_calcexp(sd, &base_exp, &job_exp, src);
     
    +	if ( !(exp_flag & 1) ) {
    +		if ( sd->status.base_level >= 5 )
    +			base_exp = 0;
    +		if ( sd->status.job_level >= 5 )
    +			job_exp = 0;
    +	}
    +
     	nextb = pc_nextbaseexp(sd);
     	nextj = pc_nextjobexp(sd);
     

    btw, there are 2 elysium ?

  9. 4140,Knight_Of_Abyss_Card,Abysmal Knight Card,6,20,,10,,,,,,,,2,,,,,{ bonus2 bAddClass,Class_Boss,25; },{},{}
    * Class (c)
    	Class_Normal, Class_Boss, Class_Guardian, Class_All
    	case SP_ADDCLASS: // bonus2 bAddClass,c,x;
    		PC_BONUS_CHK_CLASS(type2,SP_ADDCLASS);
    		if(!sd->state.lr_flag || sd->state.lr_flag == 3)
    			sd->right_weapon.addclass[type2]+=val;
    		else if(sd->state.lr_flag == 1)
    			sd->left_weapon.addclass[type2]+=val;
    		else if(sd->state.lr_flag == 2)
    			sd->arrow_addclass[type2]+=val;
    		break;

    answer is no ... since rathena changed the monster mode, there are no field for setunitdata to modify a monster into Class_Boss mode
    unless ... well ... make an issue in rathena github

    • Like 1
  10. yeah its too old, needs a complete revamp ...

     src/custom/script.inc     | 20 ++++++++++++++++++++
     src/custom/script_def.inc |  3 +++
     src/map/clif.cpp          |  2 +-
     src/map/pc.cpp            |  2 +-
     src/map/pc.hpp            |  2 ++
     5 files changed, 27 insertions(+), 2 deletions(-)
    
    diff --git a/src/custom/script.inc b/src/custom/script.inc
    index 839b990cb..0e8751707 100644
    --- a/src/custom/script.inc
    +++ b/src/custom/script.inc
    @@ -17,3 +17,23 @@
     //	script_pushint(st,1);
     //	return 0;
     //}
    +
    +BUILDIN_FUNC(pcblockchat) {
    +	struct map_session_data *sd = map_id2sd( script_getnum(st,2) );
    +	if ( !sd ) {
    +		ShowWarning( "buildin_pcblockchat: Couldn't find RID '%d'\n", script_getnum(st,2) );
    +		return SCRIPT_CMD_FAILURE;
    +	}
    +	sd->state.blockedchat = script_getnum(st,3) > 0;
    +	return SCRIPT_CMD_SUCCESS;
    +}
    +
    +BUILDIN_FUNC(pcblockattack) {
    +	struct map_session_data *sd = map_id2sd( script_getnum(st,2) );
    +	if ( !sd ) {
    +		ShowWarning( "buildin_pcblockattack: Couldn't find RID '%d'\n", script_getnum(st,2) );
    +		return SCRIPT_CMD_FAILURE;
    +	}
    +	sd->state.blockedattack = script_getnum(st,3) > 0;
    +	return SCRIPT_CMD_SUCCESS;
    +}
    diff --git a/src/custom/script_def.inc b/src/custom/script_def.inc
    index 886399273..63e683e82 100644
    --- a/src/custom/script_def.inc
    +++ b/src/custom/script_def.inc
    @@ -9,3 +9,6 @@
      **/
     
     //BUILDIN_DEF(example,""),
    +
    +BUILDIN_DEF(pcblockchat,"ii"),
    +BUILDIN_DEF(pcblockattack,"ii"),
    diff --git a/src/map/clif.cpp b/src/map/clif.cpp
    index 72a596a25..d8631a6fc 100644
    --- a/src/map/clif.cpp
    +++ b/src/map/clif.cpp
    @@ -10110,7 +10110,7 @@ static bool clif_process_message(struct map_session_data* sd, bool whisperFormat
     	if( is_atcommand( fd, sd, out_message, 1 )  )
     		return false;
     
    -	if (sd->sc.cant.chat)
    +	if (sd->sc.cant.chat || sd->state.blockedchat)
     		return false; //no "chatting" while muted.
     
     	if( battle_config.min_chat_delay ) { //[Skotlex]
    diff --git a/src/map/pc.cpp b/src/map/pc.cpp
    index 5aace7ecb..7a9bce86e 100755
    --- a/src/map/pc.cpp
    +++ b/src/map/pc.cpp
    @@ -9106,7 +9106,7 @@ bool pc_candrop(struct map_session_data *sd, struct item *item)
     bool pc_can_attack( struct map_session_data *sd, int target_id ) {
     	nullpo_retr(false, sd);
     
    -	if( pc_is90overweight(sd) || pc_isridingwug(sd) )
    +	if( pc_is90overweight(sd) || pc_isridingwug(sd) || sd->state.blockedattack )
     		return false;
     
     	if( sd->sc.data[SC_BASILICA] ||
    diff --git a/src/map/pc.hpp b/src/map/pc.hpp
    index ea5465bc8..9bcc01a88 100644
    --- a/src/map/pc.hpp
    +++ b/src/map/pc.hpp
    @@ -256,6 +256,8 @@ struct map_session_data {
     		unsigned int night :1; //Holds whether or not the player currently has the SI_NIGHT effect on. [Skotlex]
     		unsigned int using_fake_npc :1;
     		unsigned int rewarp :1; //Signals that a player should warp as soon as he is done loading a map. [Skotlex]
    +		unsigned int blockedattack : 1;
    +		unsigned int blockedchat : 1;
     		unsigned int killer : 1;
     		unsigned int killable : 1;
     		unsigned int doridori : 1;
    prontera,153,178,4	script	GvGPvP Watcher	414,{
    	if ( select ( "go to pvp", "spectator" ) == 2 ) {
    		pcblockchat getcharid(3), true;
    		pcblockattack getcharid(3), true;
    		pcblockskill getcharid(3), true;
    		setoption Option_Invisible, true;
    	}    
    	warp "pvp_y_2-1",0,0;
    	end;
    OnPCLogoutEvent:
    	setoption Option_Invisible, false;
    	end;
    }
    pvp_y_2-1	mapflag	pvp
    pvp_y_2-1	mapflag	nowarp
    pvp_y_2-1	mapflag	nowarpto
    pvp_y_2-1	mapflag	nosave	SavePoint

     

    btw rathena developer still didn't do anything about that pull request ...
    https://github.com/rathena/rathena/pull/3209

     

  11. I think rathena *progressbar is currently broken ...

    I kinda remember my arathi basin script, which also uses progressbar to turn the flag to your side ... at the time making the script,
    tested on rathena -> I can move to simply cancel the progress
    tested on hercules -> I can't move, have to get hit from something

    so to answer your question, in hercules, once the progressbar start, there is no way to cancel it other than
    1. get hit
    2. warp

    if trying to use skill while *progressbar, its the same as rathena
    Any work in progress (NPC dialog, manufactoring ... ) quit and try again

  12. there are 2 path-finding bug I'm currently aware of ... in rathena

    1. if you ask me when rathena implement the unitwalk with event labels
    https://github.com/rathena/rathena/commit/730311e009c8078ecc21f679c425de944b293faf#diff-5961416799718de4529b20c1de23b440R6970
    it was 3~4 years ago
    and if they have to change the path-finding to implement this ... event label, then its clearly has been broken before that commit

     

    2. or maybe the problem you are addressing is ...

    prontera,147,174,5	script	asdfasdf	402,{
    	warp "prontera",155,185;
    }

    click on this npc, and you walk to npc despite there is no unitwalk script command ...
    if you are talking about this, this bug also happens on Hercules, this one I have no idea how to fix

     

    and sorry, I also not having enough knowledge to fix either of these
    .... and... I think this is a bug, definitely not happen on official server

     

     


    EDIT: Provoke is mainly use to lower the DEF of monsters, because of risking making the monster ATK higher, this skill is situational
    ... mainly use on high DEF and low ATK low HIT monsters

    • Upvote 1
  13. utofaery is correct, my script uses getitem2 actually shows which item I got,

    You got Lucky Vital Hard Dexterous Knife [3] (1)
    You got +3 Quadruple Lucky Knife [4] (1)

    and using identifyall script command only shows

    Item Appraisal has completed successfully
    Item Appraisal has completed successfully

     

    identifyall script command .... unique to rathena ... check

    I not really sure how players gets random option equipment officially ... though
    I thought this system is custom .... there is no getitem3 anywhere in rathena npc folder... although we just kinda make emulator supports it

  14. 1. if the weapon is broken, and use *repairall script command, the equipment will stay in its own index
    so its fine to immediately repair it, and immediately re-equip it
    well, no idea how you going to code the auto-equip though

     

    solution 2 is better, like I said, spear boomerang and shield boomerang are the best skill to draw hate from a distance -> always (best) keep the party in wedge formation
    and never use provoke to draw hate ... if the sniper/wizard already engage monster automatically, using provoke will likely put them in danger

    ... can throw stone even draw hate from sniper/wizard ?? I highly doubt it ...

     

    EDIT: by the way... do you play Dungeon Siege ? that game also has some kind of ... party control vs mobs

  15. @inventorylist_attribute[] - whether it is broken.
    1 = broken, 0 = not broken

    well, because my healer script actually has ... many functions, including *repairall, which your script missing ...
    https://drive.google.com/file/d/19jGaMK0QqAU76XufxwiyqEAZ_AUJaJRu/view
    note this is hercules script ... rathena doesn't support skill name or item name as constants ... also SC_INC_AGI is SC_INCREASEAGI in rathena .. etc

    looking at your script, having high identify cost, I guess your players has to go to repairman to get equipment repair

    prontera,147,174,5	script	Identifier::identifier	402,{
    //	getitem2 1201, 1,0,0,0, 4001,4002,4003,4004;
    //	getitem2 1202, 1,0,3,0, 4001,4001,4001,4001;
    
    	.@price = 100; // that's expensive ... 1 magnifier cost 40 zeny actually
    	getinventorylist;
    	for ( .@i = 0; .@i < @inventorylist_count; ++.@i ) {
    		if ( @inventorylist_identify[.@i] )
    			continue;
    		if ( Zeny < .@price ) {
    			dispbottom "The price is "+ .@price +" zeny to identify an item.";
    			break;
    		}
    		Zeny -= .@price;
    		delitem2 @inventorylist_id[.@i], 1, 0, @inventorylist_refine[.@i], @inventorylist_attribute[.@i], @inventorylist_card1[.@i], @inventorylist_card2[.@i], @inventorylist_card3[.@i], @inventorylist_card4[.@i];
    		getitem2 @inventorylist_id[.@i], 1, 1, @inventorylist_refine[.@i], @inventorylist_attribute[.@i], @inventorylist_card1[.@i], @inventorylist_card2[.@i], @inventorylist_card3[.@i], @inventorylist_card4[.@i];
    		++.@total_item'
    		.@total_zeny += .@price;
    	}
    	if ( !.@total_item ) {
    		message strcharinfo(0),"No identified items.";
    		end;
    	}
    	specialeffect2 EF_REFINEOK;
    	message strcharinfo(0), "Identify "+ .@total_item +" items for "+ .@total_zeny +" Zeny";
    	end;
    }

     

    • Upvote 1
  16. frenzy is use as a last ditch effort when run out of potions (or wish to save them), and want to kill the last batch of monsters at hand
    or just want to run away in a no-teleport map (can't use wing of fly/butterfly)
    if play as a team (your project) it not so useful, but when play solo, this skill is extremely useful to save potions

    I always on Concentration ... just a personal preference
    because it reduce defence and not flee, Agi build lord knight has more advantage than Vit build when using this skill
    increase 50 hit is useful if you always miss something

    head crush and joint beat is totally useless in PvM, even spam pierce has higher damage than any of these
    joint beat is useful in PvP, some status ailment like curse/fear/blind is useful in pvp situation ... joint beat needs 3 points from head crush

    Charge attack, a must learn skill for PvP, immediately close in wizard/hunter from far away
    PvM ? I found spear boomerang more useful to draw hate ... in a team PvM fight should always keep the formation in tact

    btw there are 2 common lord knight builds,
    1 vit build - spear skill tree
    2. agi build - two hand sword skill tree

     

    don't ask me about any of the 3rd job skill, I didn't play RO for a very long time too

     

    EDIT:

    stalkers are useless in PvM ... this class is highly demand in PvP situation though
    yeah only the double strafe is useful in PvM

    chasewalk vs hide ... is a very debate topic
    chasewalk walk faster than hide <-- perhaps is the only thing useful in PvM
    if want to use backstab, use hide, then walk slowly behind the target, backstab, lots of damage

    sniper ... up agi dex luk = killing machine
    or dex+int = falcon assault build

    whitesmith ... weapon breaking buff is no problem, can repair broken weapon on the field

    creator ... berserk pitcher and potion pitcher skill is highly useful in PvM

  17. set .slot$, "2966|2968"; //Items that can be slotted.

    change into

    set .slot$, "2966|2967|2968|2969"; //Items that can be slotted.

    although some in-game testing, it seems it actually only allow to enchant non-slot equipments
    because 2967 and 2969 are slot items

×
×
  • Create New...