Jump to content

Bringer

Members
  • Posts

    745
  • Joined

  • Last visited

  • Days Won

    1

Posts posted by Bringer

  1. 4 hours ago, Winterfox said:

    This will make the mob move and allows configuring how often an item is dropped per percent threshold and how often the item is stacked.
    The movement is sadly a bit limited. You will have to set several waypoints, for the mob to follow, and the mob will stop permanently when attacked.

    I didn't find a fix for the problem of stopping, so I will leave it like this. Maybe someone else can help you fix this issue.

    100% Working Thank So Much !!

    my Custom mob Setup
    Can Move
    No Random Walk
    MVP
    Knockback Immune
    Status Immune
    4 hours ago, Winterfox said:

    The movement is sadly a bit limited. You will have to set several waypoints, for the mob to follow, and the mob will stop permanently when attacked.
    I didn't find a fix for the problem of stopping, so I will leave it like this. Maybe someone else can help you fix this issue.

    dMotion = 0
    how long it is before the monster/player can move again. Endure is dMotion = 0, obviously.

  2. 11 hours ago, Winterfox said:
    -	script	MVP_EVENT	FAKE_NPC,{
        OnInit:
            // Mobinfo
            .mob = 1159;
            .map$ = "prontera";
            .x = 150;
            .y = 150;
            .respawn_time = 15; // Respawntime in minutes
            .percent = 10; // Item drop every x hp percent.
    
            // Dropiteminfo
            .item = 7959;
            .amount = 5;
    
        OnSpawn:
            monster(.map$, .x, .y, strmobinfo(1, .mob), .mob, 1);
            
            .@gid = $@mobid[0];
            getunitdata(.@gid, .@mvp_data);
            .@max_hp = .@mvp_data[UMOB_MAXHP];
    
            freeloop(1);
            while(unitexists(.@gid)) {
                getunitdata(.@gid, .@mvp_data);
                .@curr_hp_percent = ceil((.@mvp_data[UMOB_HP] * 100 / .@max_hp) - .percent, .percent);
    
                if(.@curr_hp_percent == .@last_hp_percent) {
                    sleep(500);
                    continue;
                }
    
                if(.@curr_hp_percent > .@last_hp_percent)
                    .@next_drop_percent = .@curr_hp_percent - .percent;
    
                .@last_hp_percent = .@curr_hp_percent;
    
                if(.@next_drop_percent >= .@curr_hp_percent) {
                    makeitem(.item, .amount, mapid2name(.@mvp_data[UMOB_MAPID]), .@mvp_data[UMOB_X], .@mvp_data[UMOB_Y], 1);
                    .@next_drop_percent -= .percent;
                }
    
                sleep(500);
            }
            freeloop(0);
    
            sleep(1000 * 60 * .respawn_time);
            donpcevent("MVP_EVENT::OnSpawn");
            end;
    }

     

    on my orignal trunk i got this error FIXED ERROR https://github.com/rathena/rathena/commit/2eebafb70330e37dd69a384ce0af52570b4956c2

    image.thumb.png.aea9e0393734c7dfa26bb38a91ad58b5.png

    so test latest  rathena is working but

    monster just like normal summon 

    i can request to monster using unitwalk just like on the video monster only WALKING  so monster walk only the giving coordinate

    1st Respawn

            .map$ = "new_1-4";
            .x = 11;
            .y = 188;


    once summoned monster will move 

    1st waypoint then 2nd waypoint and so on then repeat until the monster reach last waypoint then repeat again the loop

    2nd Request


    can you make it drop shower?  tell say 5x5 ?

     

  3. try this

    skill.cpp
    
    		if( sc && sc->data[SC_CURSEDCIRCLE_ATKER] ) //Should only remove after the skill has been casted.
    			status_change_end(src,SC_CURSEDCIRCLE_ATKER,INVALID_TIMER);
    		return 0; // not to consume item.
    
    +	case MO_BODYRELOCATION:
    +			if (battle_config.lock && sd && (sd->sc.data[SC_ANKLE] || sd->sc.data[SC_SPIDERWEB])) {
    +				clif_skill_fail(sd, skill_id, USESKILL_FAIL_LEVEL, 0);
    +				break;
    +			}
    
    Find
    
    		skill_blown(src,bl,skill_get_blewcount(skill_id,skill_lv),unit_getdir(bl),(enum e_skill_blown)(BLOWN_IGNORE_NO_KNOCKBACK
    #ifdef RENEWAL
    
    ADD THIS ABOVE
    +	case TF_BACKSLIDING: //This is the correct implementation as per packet logging information. [Skotlex]
    +		if (battle_config.lock && sd && (sd->sc.data[SC_ANKLE] || sd->sc.data[SC_SPIDERWEB])) {
    +			clif_skill_fail(sd, skill_id, USESKILL_FAIL_LEVEL, 0);
    +			break;
    +
    +		}
    
    battle.hpp
    
    +	int lock;
    #include "../custom/battle_config_struct.inc"
    };
    
    battle.cpp
    +	{ "lock",                      &battle_config.lock,                   0,      0,      1,              },
    #include "../custom/battle_config_init.inc"
    
    
    trunk\conf\import\battle_conf.txt
    
    +// If set to false, will not be enabled.)
    +lock: true

    i try this code i dont have any error
     

    +	if (skill_id == MO_EXTREMITYFIST && ((sd->spiritball == 0 && battle_config.asura_absorb_cast_cancel) || (!sd->sc.data[SC_EXPLOSIONSPIRITS] && battle_config.asura_dispell_cast_cancel))) {
    +		clif_skill_fail(sd, skill_id, USESKILL_FAIL_LEVEL, 0);
    +		return 0;
    +	}
    	switch( sd->menuskill_id ) {
    		case AM_PHARMACY:

     

  4. On 5/1/2023 at 10:46 AM, joecalis said:

    In the latest version of Rathena this is already implemented.
    If you're using an older version you might have to diff patch the itemlink commands by Cydh.

    The older rathena versions supports the "itemlink-20190319-e6f1f21d.diff"

    Then you would have to edit the atcommand.cpp in ACMD_FUNC(mobinfo)

    Find:

    		for (i = 0; i < MAX_MOB_DROP_TOTAL; i++) {
    			int droprate;
    			if (mob->dropitem[i].nameid <= 0 || mob->dropitem[i].p < 1 || (item_data = itemdb_exists(mob->dropitem[i].nameid)) == NULL)
    				continue;
    			droprate = mob->dropitem[i].p;
    
    #ifdef RENEWAL_DROP
    			if( battle_config.atcommand_mobinfo_type ) {
    				droprate = droprate * pc_level_penalty_mod(mob->lv - sd->status.base_level, mob->status.class_, mob->status.mode, 2) / 100;
    				if (droprate <= 0 && !battle_config.drop_rate0item)
    					droprate = 1;
    			}
    #endif
    			if (pc_isvip(sd)) // Display drop rate increase for VIP
    				droprate += (droprate * battle_config.vip_drop_increase) / 100;
    			if (item_data->slot)
    				sprintf(atcmd_output2, " - %s[%d]  %02.02f%%", item_data->jname, item_data->slot, (float)droprate / 100);
    			else
    				sprintf(atcmd_output2, " - %s  %02.02f%%", item_data->jname, (float)droprate / 100);
    			strcat(atcmd_output, atcmd_output2);
    			if (++j % 3 == 0) {
    				clif_displaymessage(fd, atcmd_output);
    				strcpy(atcmd_output, " ");
    			}
    		}
    		if (j == 0)
    			clif_displaymessage(fd, msg_txt(sd,1246)); // This monster has no drops.
    		else if (j % 3 != 0)
    			clif_displaymessage(fd, atcmd_output);
    		// mvp
    		if (mob->mexp) {
    			float mvppercent, mvpremain;
    			sprintf(atcmd_output, msg_txt(sd,1247), mob->mexp); //  MVP Bonus EXP:%u
    			clif_displaymessage(fd, atcmd_output);
    			strcpy(atcmd_output, msg_txt(sd,1248)); //  MVP Items:
    			mvpremain = 100.0; //Remaining drop chance for official mvp drop mode
    			j = 0;
    			for (i = 0; i < MAX_MVP_DROP_TOTAL; i++) {
    				if (mob->mvpitem[i].nameid <= 0 || (item_data = itemdb_exists(mob->mvpitem[i].nameid)) == NULL)
    					continue;
    				//Because if there are 3 MVP drops at 50%, the first has a chance of 50%, the second 25% and the third 12.5%
    				mvppercent = (float)mob->mvpitem[i].p * mvpremain / 10000.0f;
    				if(battle_config.item_drop_mvp_mode == 0) {
    					mvpremain -= mvppercent;
    				}
    				if (mvppercent > 0) {
    					j++;
    					if (j == 1) {
    						if (item_data->slot)
    							sprintf(atcmd_output2, " %s[%d]  %02.02f%%", item_data->jname, item_data->slot, mvppercent);
    						else
    							sprintf(atcmd_output2, " %s  %02.02f%%", item_data->jname, mvppercent);
    					} else {
    						if (item_data->slot)
    							sprintf(atcmd_output2, " - %s[%d]  %02.02f%%", item_data->jname, item_data->slot, mvppercent);
    						else
    							sprintf(atcmd_output2, " - %s  %02.02f%%", item_data->jname, mvppercent);
    					}
    					strcat(atcmd_output, atcmd_output2);
    				}
    			}
    			if (j == 0)
    				clif_displaymessage(fd, msg_txt(sd,1249)); // This monster has no MVP prizes.
    			else
    				clif_displaymessage(fd, atcmd_output);
    		}

    Change to:

    		for (i = 0; i < MAX_MOB_DROP_TOTAL; i++) {
    			int droprate;
    			int dropbonus = 0;
    
    			if (mob->dropitem[i].nameid <= 0 || mob->dropitem[i].p < 1 || (item_data = itemdb_exists(mob->dropitem[i].nameid)) == NULL)
    				continue;
    			droprate = mob->dropitem[i].p;
    
    #ifdef RENEWAL_DROP
    			if( battle_config.atcommand_mobinfo_type ) {
    				droprate = droprate * pc_level_penalty_mod(mob->lv - sd->status.base_level, mob->status.class_, mob->status.mode, 2) / 100;
    				if (droprate <= 0 && !battle_config.drop_rate0item)
    					droprate = 1;
    			}
    #endif
    			if((sd->sc.count && sd->sc.data[SC_ITEMBOOST])) // Display drop rate increase for SC_ITEMBOOST eg. Bubblegum
    				dropbonus += (droprate * sd->sc.data[SC_ITEMBOOST]->val1) / 100;
    			if (pc_isvip(sd)) // Display drop rate increase for VIP
    				dropbonus += (droprate * battle_config.vip_drop_increase) / 100;
    			if (dropbonus)
    				sprintf(atcmd_output2, " %s  %02.02f%% + (%02.02f%%)", createItemLink(item_data->nameid, 0, NULL).c_str(), (float)droprate / 100, (float)dropbonus / 100);
    			else
    				sprintf(atcmd_output2, " %s  %02.02f%%", createItemLink(item_data->nameid, 0, NULL).c_str(), (float)droprate / 100);
    			strcat(atcmd_output, atcmd_output2);
    			j++;
    			clif_displaymessage(fd, atcmd_output);
    			strcpy(atcmd_output, " ");
    		}
    		if (j == 0)
    			clif_displaymessage(fd, msg_txt(sd,1246)); // This monster has no drops.
    		// mvp
    		if (mob->mexp) {
    			float mvppercent, mvpremain;
    			sprintf(atcmd_output, msg_txt(sd,1247), mob->mexp); //  MVP Bonus EXP:%u
    			clif_displaymessage(fd, atcmd_output);
    			strcpy(atcmd_output, msg_txt(sd,1248)); //  MVP Items:
    			clif_displaymessage(fd, atcmd_output);
    			strcpy(atcmd_output, " ");
    			mvpremain = 100.0; //Remaining drop chance for official mvp drop mode
    			j = 0;
    			for (i = 0; i < MAX_MVP_DROP_TOTAL; i++) {
    				if (mob->mvpitem[i].nameid <= 0 || (item_data = itemdb_exists(mob->mvpitem[i].nameid)) == NULL)
    					continue;
    				//Because if there are 3 MVP drops at 50%, the first has a chance of 50%, the second 25% and the third 12.5%
    				mvppercent = (float)mob->mvpitem[i].p * mvpremain / 10000.0f;
    				if(battle_config.item_drop_mvp_mode == 0) {
    					mvpremain -= mvppercent;
    				}
    				if (mvppercent > 0) {
    					j++;
    					sprintf(atcmd_output2, " %s  %02.02f%%", createItemLink(item_data->nameid, 0, NULL).c_str(), mvppercent);
    					strcat(atcmd_output, atcmd_output2);
    					clif_displaymessage(fd, atcmd_output);
    					strcpy(atcmd_output, " ");
    				}
    			}
    			if (j == 0)
    				clif_displaymessage(fd, msg_txt(sd,1249)); // This monster has no MVP prizes.
    		}

     

    thanks for this Working 100%

    i'm using itemlink-20190319-e6f1f21d.diff

    • MVP 1
  5. 4 hours ago, RandomUser45678 said:

    skill_delay_attack_enable is already 1, since that is the default. I tried no but that didnt change anything

    the video is from 10 years ago we dont know if that server have anti cheat or anti 0 delay GRF

  6. 8 hours ago, RandomUser45678 said:

    Hey everyone, wondering how this is being done from a server point of view?

    Notice the priest can spam very fast when being hit. but when not hit there is regular cooldown.

     

     

     

    // The rate of time it takes to cast a spell (Note 2, 0 = No casting time)

    casting_rate: 100

     

    // Delay time after casting (Note 2)

    delay_rate: 0

     

    // Does the delay time depend on the caster's DEX and/or AGI? (Note 1)

    // Note: On Official servers, neither Dex nor Agi affect delay time

    delay_dependon_dex: no

    delay_dependon_agi: yes

     

    // Minimum allowed delay for ANY skills after castbegin (in milliseconds) (Note 1)

    // Note: Setting this to anything above 0 can stop speedhacks.

    min_skill_delay_limit: 10

     

    // This delay is the min 'can't walk delay' of all skills.

    // NOTE: Do not set this too low, if a character starts moving too soon after 

    // doing a skill, the client will not update this, and the player/mob will 

    // appear to "teleport" afterwards.

    default_walk_delay: 80

     

     

    Try this settings your skill. Conf

  7. try check this

    on latest rathena 
    https://github.com/rathena/rathena/blob/master/src/map/pc.cpp#L7289
     

    /**
     * Check if we still have the correct weapon to continue the skill (actually status)
     * If not ending it
     * @param sd
     * @return 0:error, 1:check done
     */
    static void pc_checkallowskill(struct map_session_data *sd)
    {
    	const enum sc_type scw_list[] = {
    		SC_TWOHANDQUICKEN,
    		SC_ONEHAND,
    		SC_AURABLADE,
    		SC_PARRYING,
    		SC_SPEARQUICKEN,
    		SC_ADRENALINE,
    		SC_ADRENALINE2,
    		SC_DANCING,
    		SC_GATLINGFEVER,
    	};
    	uint8 i;
    	nullpo_retv(sd);
    
    	if(!sd->sc.count)
    		return;
    
    	for (i = 0; i < ARRAYLENGTH(scw_list); i++)
    	{	// Skills requiring specific weapon types
    		if( scw_list[i] == SC_DANCING && !battle_config.dancing_weaponswitch_fix )
    			continue;
    		if(sd->sc.data[scw_list[i]] &&
    			!pc_check_weapontype(sd,skill_get_weapontype(status_sc2skill(scw_list[i]))))
    			status_change_end(&sd->bl, scw_list[i], INVALID_TIMER);
    	}
    
    	if(sd->sc.data[SC_SPURT] && sd->status.weapon)
    		// Spurt requires bare hands (feet, in fact xD)
    		status_change_end(&sd->bl, SC_SPURT, INVALID_TIMER);
    
    	if(sd->status.shield <= 0) { // Skills requiring a shield
    		const enum sc_type scs_list[] = {
    			SC_AUTOGUARD,
    			SC_DEFENDER,
    			SC_REFLECTSHIELD,
    			SC_REFLECTDAMAGE
    		};
    		for (i = 0; i < ARRAYLENGTH(scs_list); i++)
    			if(sd->sc.data[scs_list[i]])
    				status_change_end(&sd->bl, scs_list[i], INVALID_TIMER);
    	}
    }

     

×
×
  • Create New...