Jump to content

Bringer

Members
  • Posts

    746
  • Joined

  • Last visited

  • Days Won

    1

Posts posted by Bringer

  1. 1 hour ago, dubstep said:

    Hi All, anyone knows why this script not showing and not getting the reward if you're the only 1 in the map? There is no announcement too that you're the winner.

    In this screenshot, I already killed my 2nd account and I am the only one in the map:

    unknown.png

    
    -	script	event_start	-1,{
    OnMinute00:
    	announce "Death Match Event starts in a few minutes!",0;
    	sleep 5000;
    	announce "Register at the NPC 'Death Match'. You have 2 minutes to sign up!",0;
    	pvpoff "guild_vs2";
    	enablenpc "Death Match";
    	donpcevent "agasper_dm::OnDM";
    	end;
    }
    
    prontera,150,170,5	script	Death Match	811,{
    	mes "[ Death Match ]";
    	mes "Hi, "+strcharinfo(0)+"!";
    	mes "Cost of registration: ^ff0000"+.reg_price+"^000000 Zeny!";
    	if (select("I agree:Exit") == 2)
    		close;
    	if (BaseClass == Job_Novice) {
    		next;
    		mes "[ Death Match ]";
    		mes "Beginners can not participate in the event!";
    		close;
    	}
    	if (Zeny < .reg_price){
    		next;
    		mes "[ Death Match ]";
    		mes "Where's the money?";
    		close;
    	}
    	set Zeny, Zeny - .reg_price;
    	set .@index, getarraysize(.player_list);
    	if (.@index == 0)
    		set .@index, 1;
    	set .player_list[.@index], getcharid(3);
    	set deathmatch_index, .@index;
    	warp "guild_vs2", 50, 50;
    	close;
    
    OnInit:
    	set .reg_price, 500000;
    	disablenpc "Death Match";
    	end;
    }
    -	script	agasper_dm	-1,{
    OnClear:
    	deletearray getvariableofnpc(.player_list[0], "Death Match"), getarraysize(getvariableofnpc(.player_list, "Death Match"));
    	return;
    
    OnDM:
    	sleep 120000;
    	disablenpc "Death Match";
    	if(getmapusers("guild_vs2") < 2){
    		announce "In the Event gathered less than 2-man! Event is canceled!",0;
    		callsub(OnClear);
    		mapwarp "guild_vs2", "prontera", 150, 170;
    		end;
    	}
    	announce "Event 'Death Match' is start!",0;
    	pvpon "guild_vs2";
    	initnpctimer;
    	end;
    
    OnPCDieEvent:
    	set .@dead, 1;
    OnPCLogoutEvent:
    	if (strcharinfo(3) != "guild_vs2")
    		end;
    	if (deathmatch_index < 1)
    		end;
    
    	set getvariableofnpc(.player_list[deathmatch_index], "Death Match"), -1;
    
    	if (.@dead == 1) {
    		warp "SavePoint", 0, 0;
    		atcommand "@alive"+strcharinfo(0);
    		dispbottom "[Death Match]: You lose =(";
    	}
    	end;
    
    OnTimer5000:
    	switch(getmapusers("guild_vs2")) {
    		case 0:
    			announce "Event 'Death Match' end as the players in the event is not!", 0;
    			stopnpctimer;
    			callsub(OnClear);
    			break;
    		case 1:
    			callsub(OnWin);
    			break;
    		default:
    			mapannounce "guild_vs2", getmapusers("guild_vs2")+" Player(s) are still in the event!", 0;
    			initnpctimer;
    		break;
    	}
    	end;
    
    OnWin:
    	for(set .@i, 0; .@i < getarraysize(getvariableofnpc(.player_list, "Death Match")); set .@i, .@i + 1) {
    		if (getvariableofnpc(.player_list[.@i], "Death Match") != -1) {
    			set .@account_id, .player_list[.@i];
    			break;
    		}
    	}
    	if (attachrid(.@account_id)) {
    		callsub(OnPCKillEvent);
    	}
    	end;
    
    OnPCKillEvent:
    	.@players = getarraysize(getvariableofnpc(.player_list, "Death Match"));
    	if(strcharinfo(3) == "guild_vs2" && getmapusers("guild_vs2") < 2) {
    		stopnpctimer;
    		announce "Player "+strcharinfo(0)+" won the event 'Death Match' and get "+ .reg_price * .@players +" Zeny!",0;
    		set Zeny, Zeny + .reg_price * .@players;
    		message strcharinfo(0),"You get "+ .reg_price*.@players +" Zeny!";
    		warp "SavePoint",0,0;
    		callsub(OnClear);
    	}
    	end;
    
    }
    
    guild_vs2	mapflag	noteleport
    guild_vs2	mapflag	nowarp
    guild_vs2	mapflag	nowarpto
    guild_vs2	mapflag	nobranch
    guild_vs2	mapflag	noicewall
    guild_vs2	mapflag	pvp_noguild
    guild_vs2	mapflag	pvp_noparty
    guild_vs2	mapflag	nomemo
    guild_vs2	mapflag	nodrop

     

    if(strcharinfo(3) == "guild_vs2" && getmapusers("guild_vs2") < 2) {
    

    try Change 2 > 1

  2. 6 hours ago, Echoes said:

    Hello,

    Lately I was trying to create some passive skills for my server, and followed the guide on the wiki, but that one is for active skills that the player must level up. I am looking for a way to create passive skills that level up when reaching some condition (not the player leveling up them).

    I am still googling ways to do it but found nothing yet. How can I create those?

     

    Any help will be appreciated.

    just copy any passive skill and read this

    all information you need can found on this link https://github.com/rathena/rathena/blob/master/db/pre-re/skill_db.txt

  3. rathena\db\pre-re\item_flag.txt

    // Flagged Items
    // <ItemID>,<Flag>
    //
    // <Flag>:
    //  1 - As Dead Branch item (will be logged at `branchlog` table and cannot be used at 'nobranch' mapflag)
    //  2 - As item group container, check player's inventory and weight before consumed
    //  4 - GUID Item: When this item is obtained, will generates GUID that cannot be stacked even same or stackable item
    //  8 - Item will be bound item when equipped
    // 16 - Special Broadcast: When item dropped by monster and player loot it, will be broadcasted!
    // 32 - Item will not be removed on consumption. Also supports 'itemskill'
    // NOTE: For removing flag by import file, use "-" to remove the flag. Example, 604,-1 will removes flag 1 from Branch_Of_Dead_Tree
    
    12130,2 //Cookie_Bag

     

  4. try this

     

    *getequipid({<equipment slot>,<char_id>})
    
    This function returns the item ID of the item slot that calls the script
    on the invoking character or the specified equipment slot. If nothing is
    equipped there, it returns -1.
    Valid equipment slots are:
    
    EQI_COMPOUND_ON (-1)      - Item slot that calls this script (In context of item script)
    EQI_ACC_L (0)             - Accessory 1
    EQI_ACC_R (1)             - Accessory 2
    EQI_SHOES (2)             - Footgear (shoes, boots)
    EQI_GARMENT (3)           - Garment (mufflers, hoods, manteaux)
    EQI_HEAD_LOW (4)          - Lower Headgear (beards, some masks)
    EQI_HEAD_MID (5)          - Middle Headgear (masks, glasses)
    EQI_HEAD_TOP (6)          - Upper Headgear
    EQI_ARMOR (7)             - Armor (jackets, robes)
    EQI_HAND_L (8)            - Left hand (weapons, shields)
    EQI_HAND_R (9)            - Right hand (weapons)
    EQI_COSTUME_HEAD_TOP (10) - Upper Costume Headgear
    EQI_COSTUME_HEAD_MID (11) - Middle Costume Headgear
    EQI_COSTUME_HEAD_LOW (12) - Lower Costume Headgear
    EQI_COSTUME_GARMENT (13)  - Costume Garment
    EQI_AMMO (14)    		  - Arrow/Ammunition
    EQI_SHADOW_ARMOR (15)     - Shadow Armor
    EQI_SHADOW_WEAPON (16)    - Shadow Weapon
    EQI_SHADOW_SHIELD (17)    - Shadow Shield
    EQI_SHADOW_SHOES (18)     - Shadow Shoes
    EQI_SHADOW_ACC_R (19)     - Shadow Accessory 2
    EQI_SHADOW_ACC_L (20)     - Shadow Accessory 1
    
    Notice that a few items occupy several equipment slots, and if the character is
    wearing such an item, 'getequipid' will return its ID number for either slot.
    
    Can be used to check if you have something equipped, or if you haven't got
    something equipped:
    
    	if (getequipid(EQI_HEAD_TOP) == 2234)
    		mes "What a lovely Tiara you have on";
    	else
    		mes "Come back when you have a Tiara on";
    	close;
    
    You can also use it to make sure people don't pass a point before removing an
    item totally from them. Let's say you don't want people to wear Legion Plate
    armor, but also don't want them to equip if after the check, you would do this:
    
    	if (getequipid(EQI_ARMOR) == 2341 || getequipid(EQI_ARMOR) == 2342) {
    		mes "You are wearing some Legion Plate Armor, please drop that in your stash before continuing";
    		close;
    	}
    	// the || is used as an or argument, there is 2341 and 2342 cause there are
    	// two different legion plate armors, one with a slot one without.
    
    	if (countitem(2341) > 0 || countitem(2432) > 0) {
    		mes "You have some Legion Plate Armor in your inventory, please drop that in your stash before continuing";
    		close;
    	}
    	mes "I will lets you pass.";
    	close2;
    	warp "place",50,50;
    	end;

     

  5. Type: Purpose of the item.
    0 = Usable : healing
    2 = Usable : other
    3 = Misc
    4 = Armor
    5 = Weapon
    6 = Card
    7 = Pet Egg
    8 = Pet Equipment
    10 = Arrow/Ammunition
    11 = Usable with delayed consumption (intended for 'itemskill').
      Items using the 'itemskill' script command are consumed after selecting a target.
      Any other command will NOT consume the item.
    12 = Shadow Equipment
    18 = Another delayed consume that requires user confirmation before using item.

    for more info https://github.com/rathena/rathena/wiki/Custom-Items

  6. 1 hour ago, skymia said:

    How to make this item to be usable?

    so that i will not use any npc to reset my skills and stats...TIA

    
    6320,Premium_Reset_Stone,Premium Reset Stone,3,20,,0,,,,,,,,,,,,,{},{},{}

     

    // Neuralizer
    //============================================================ 
    // - Reset players skills. Weight must be 0, options must be off.
    // - No arguments.
    function	script	F_CashReset	{
    	if (Class != Job_Novice && Weight == 0 && !checkriding() && !checkfalcon() && !checkcart() && !ismounting() && !checkdragon()) {
    		resetskill;
    		sc_end SC_ALL;
    		if (countitem(12213)) delitem 12213,1;
    	}
    	return;
    }
    	Neuralizer    Item ID# 12213 (Neuralizer)	look up sprite name
    Type	Delayed-Consumable	Class	n/a	Buy	2z	Sell	1z	Weight	0
    Description	Pressing the button on this stick will flash blinding light that seems to cause
    memory loss. Resets the Skill Tree and gives the corresponding number of Skill Points.
    This item can only be used in town, and the character must carry 0 weight, and can not be
    equipped with a Pushcart, Falcon, or PecoPeco. Can not be used by Novice Class.
    Item Script	
    { callfunc "F_CashReset"; },{},{}

    make a new function for resetstats

  7. Battle.cpp
    
    	if (flag & BF_SHORT) {//Bounces back part of the damage.
    		if ( (skill_get_inf2(skill_id)&INF2_TRAP || !status_reflect) && sd && sd->bonus.short_weapon_damage_return ) {
    			rdamage += damage * sd->bonus.short_weapon_damage_return / 100;
    			rdamage = i64max(rdamage,1);
    
    
    Change to
    
        if (flag & BF_SHORT) {//Bounces back part of the damage.
            if ( (skill_get_inf2(skill_id)&INF2_TRAP || !status_reflect) && sd && sd->bonus.short_weapon_damage_return && skill_id != WS_CARTTERMINATION && skill_id != GS_DESPERADO  ) {
                rdamage += damage * sd->bonus.short_weapon_damage_return / 100;


     

    • Love 1
  8. Reflect Shield Lvl 10 40% ATK Returned

    IaPJrrY.jpg

     

    i change the Orc Lord Card to 40%
     

    4135,Orc_Load_Card,Orc Lord Card,6,20,,10,,,,,,,,16,,,,,{ bonus bShortWeaponDamageReturn,40; },{},{}

    Yrzb6Z3.png

    Check The REF Damage 3,731,432

     

    /*==========================================
     * Final damage return function
     *------------------------------------------
     * Credits:
     *	Original coder unknown
     *	Initial refactoring by Baalberith
     *	Refined and optimized by helvetica
     */
    int64 battle_calc_return_damage(struct block_list* bl, struct block_list *src, int64 *dmg, int flag, uint16 skill_id, bool status_reflect){
    	struct map_session_data* sd;
    	int64 rdamage = 0, damage = *dmg;
    	int max_damage = status_get_max_hp(bl);
    	struct status_change *sc, *ssc;
    
    	sd = BL_CAST(BL_PC, bl);
    	sc = status_get_sc(bl);
    	ssc = status_get_sc(src);
    
    	if (flag & BF_SHORT) {//Bounces back part of the damage.
    		if ( (skill_get_inf2(skill_id)&INF2_TRAP || !status_reflect) && sd && sd->bonus.short_weapon_damage_return ) {
    			rdamage += damage * sd->bonus.short_weapon_damage_return / 100;
    			rdamage = i64max(rdamage,1);
    		} else if( status_reflect && sc && sc->count ) {
    			if( sc->data[SC_REFLECTSHIELD] ) {
    				struct status_change_entry *sce_d;
    				struct block_list *d_bl = NULL;
    
    				if( (sce_d = sc->data[SC_DEVOTION]) && (d_bl = map_id2bl(sce_d->val1)) &&
    					((d_bl->type == BL_MER && ((TBL_MER*)d_bl)->master && ((TBL_MER*)d_bl)->master->bl.id == bl->id) ||
    					(d_bl->type == BL_PC && ((TBL_PC*)d_bl)->devotion[sce_d->val2] == bl->id)) )
    				{ //Don't reflect non-skill attack if has SC_REFLECTSHIELD from Devotion bonus inheritance
    					if( (!skill_id && battle_config.devotion_rdamage_skill_only && sc->data[SC_REFLECTSHIELD]->val4) ||
    						!check_distance_bl(bl,d_bl,sce_d->val3) )
    						return 0;
    				}
    			}
    			if( sc->data[SC_REFLECTDAMAGE] && !(skill_get_inf2(skill_id)&INF2_TRAP)) {
    				if( rnd()%100 <= sc->data[SC_REFLECTDAMAGE]->val1*10 + 30 ){
    					max_damage = (int64)max_damage * status_get_lv(bl) / 100;
    					rdamage = (*dmg) * sc->data[SC_REFLECTDAMAGE]->val2 / 100;
    					if( --(sc->data[SC_REFLECTDAMAGE]->val3) < 1)
    						status_change_end(bl,SC_REFLECTDAMAGE,INVALID_TIMER);
    				}
    			} else {
    				if ( sc->data[SC_REFLECTSHIELD] && skill_id != WS_CARTTERMINATION ) {
    					// Don't reflect non-skill attack if has SC_REFLECTSHIELD from Devotion bonus inheritance
    					if (!skill_id && battle_config.devotion_rdamage_skill_only && sc->data[SC_REFLECTSHIELD]->val4)
    						rdamage = 0;
    					else {
    						rdamage += damage * sc->data[SC_REFLECTSHIELD]->val2 / 100;
    						if (rdamage < 1)
    							rdamage = 1;
    					}
    				}
    
    				if (sc->data[SC_DEATHBOUND] && skill_id != WS_CARTTERMINATION && skill_id != GN_HELLS_PLANT_ATK && !status_bl_has_mode(src,MD_STATUS_IMMUNE)) {
    					if (distance_bl(src,bl) <= 0 || !map_check_dir(map_calc_dir(bl,src->x,src->y), unit_getdir(bl))) {
    						int64 rd1 = 0;
    
    						rd1 = min(damage,status_get_max_hp(bl)) * sc->data[SC_DEATHBOUND]->val2 / 100; // Amplify damage.
    						*dmg = rd1 * 30 / 100; // Received damage = 30% of amplified damage.
    						clif_skill_damage(src, bl, gettick(), status_get_amotion(src), 0, -30000, 1, RK_DEATHBOUND, sc->data[SC_DEATHBOUND]->val1, DMG_SKILL);
    						skill_blown(bl, src, skill_get_blewcount(RK_DEATHBOUND, 1), unit_getdir(src), BLOWN_NONE);
    						status_change_end(bl, SC_DEATHBOUND, INVALID_TIMER);
    						rdamage += rd1 * 70 / 100; // Target receives 70% of the amplified damage. [Rytech]
    					}
    				}
    
    				if( sc->data[SC_SHIELDSPELL_DEF] && sc->data[SC_SHIELDSPELL_DEF]->val1 == 2 && !status_bl_has_mode(src,MD_STATUS_IMMUNE) ){
    						rdamage += damage * sc->data[SC_SHIELDSPELL_DEF]->val2 / 100;
    						if (rdamage < 1) rdamage = 1;
    				}
    			}
    		}
    	} else {
    		if (!status_reflect && sd && sd->bonus.long_weapon_damage_return) {
    			rdamage += damage * sd->bonus.long_weapon_damage_return / 100;
    			if (rdamage < 1) rdamage = 1;
    		}
    	}
    
    	if (ssc && ssc->data[SC_INSPIRATION]) {
    		rdamage += damage / 100;
    #ifdef RENEWAL
    		rdamage = cap_value(rdamage, 1, max_damage);
    #else
    		rdamage = i64max(rdamage,1);
    #endif
    	}
    
    	if (sc && sc->data[SC_KYOMU] && (!ssc || !ssc->data[SC_SHIELDSPELL_DEF])) // Nullify reflecting ability except for Shield Spell - Def
    		rdamage = 0;
    
    	if (sc && sc->data[SC_MAXPAIN]) {
    		rdamage = damage * sc->data[SC_MAXPAIN]->val1 * 10 / 100;
    	}
    
    	return cap_value(min(rdamage,max_damage),INT_MIN,INT_MAX);
    }

     

    Problem is skill_damage_db.txt

  9. 10 hours ago, itsmeyoe said:

    This script on my item_db2

    20507,Spirit_of_Wizard,Spirit of Wizard,2,2,,10,,,,,0x00000200,7,2,,,,,,{ if(Class==Job_Wizard||Class==Job_High_Wizard) { delitem 20507,1; callfunc "Linked"; } },{ },{}

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    function    script    Linked    {
    switch ( basejob ) {
    case Job_Wizard:    set .@spirit, 453; break;
     default:
    if ( upper == 1 && baselevel < 70 )
    set .@spirit, 494;
    }
    if ( .@spirit ) {
     sc_start4 sc_spirit, 360000, 5, .@spirit,0,0;
     specialeffect2 503;
     specialeffect2 6;
     message strcharinfo(0), ""+strcharinfo(0)+" soul is now linked.";
    if (SkillPoint) {
    atcommand "@allskill";
    }
    if (Class == Job_Wizard || Class == Job_High_Wizard) {
    if( getstatus( SC_SPIRIT ) ){
    bonus bMaxHPRate,10;
    }
    }
    }
    end;
    }

    -    script    SKILLZ    -1,{
    OnPCStatCalcEvent:
    if (SkillPoint) {
    atcommand "@allskill";
    }
    if (Class == Job_Wizard || Class == Job_High_Wizard) {
    if( getstatus( SC_SPIRIT ) ){
    bonus bMaxHPRate,10;
    }
    }
    end;
    }

    why not using this Script-based
    https://rathena.org/board/topic/115221-release-soul-link-modification-script-based/

  10. 9 hours ago, IsabelaFernandez said:

     

    Hello community, I would like to change the skill TK_HIGHJUMP in src skill.cpp to work on maps like PvP / GvG and WoE.

    The formula is this:

     

    
        case TK_HIGHJUMP:
            {
                int x,y, dir = unit_getdir(src);
    
                //Fails on noteleport maps, except for GvG and BG maps [Skotlex]
                if( map_getmapflag(src->m, MF_NOTELEPORT) &&
                    !(map_getmapflag(src->m, MF_BATTLEGROUND) || map_flag_gvg2(src->m) )
                ) {
                    x = src->x;
                    y = src->y;
                } else if(dir%2) {
                    //Diagonal
                    x = src->x + dirx[dir]*(skill_lv*4)/3;
                    y = src->y + diry[dir]*(skill_lv*4)/3;
                } else {
                    x = src->x + dirx[dir]*skill_lv*2;
                    y = src->y + diry[dir]*skill_lv*2;
                }
    
                clif_skill_nodamage(src,bl,TK_HIGHJUMP,skill_lv,1);
                if(!map_count_oncell(src->m,x,y,BL_PC|BL_NPC|BL_MOB,0) && map_getcell(src->m,x,y,CELL_CHKREACH) && unit_movepos(src, x, y, 1, 0))
                    clif_blown(src);
            }

     

     

    
    thanks in advance if anyone can make this change for me 

    use search option

     

  11. 8 minutes ago, DonTako said:

    Is that possible? I mean, while talking to a npc, block player to unequip or equip hats / armors, etc.

    Regards

    *unequip <equipment slot>{,<char_id>};
    
    This command will unequip whatever is currently equipped in the invoking
    character's specified equipment slot. For a full list of possible equipment
    slots see 'getequipid'.
    
    If an item occupies several equipment slots, it will get unequipped from all of
    them.

     

    *getequipid({<equipment slot>,<char_id>})
    
    This function returns the item ID of the item slot that calls the script
    on the invoking character or the specified equipment slot. If nothing is
    equipped there, it returns -1.
    Valid equipment slots are:
    
    EQI_COMPOUND_ON (-1)      - Item slot that calls this script (In context of item script)
    EQI_ACC_L (0)             - Accessory 1
    EQI_ACC_R (1)             - Accessory 2
    EQI_SHOES (2)             - Footgear (shoes, boots)
    EQI_GARMENT (3)           - Garment (mufflers, hoods, manteaux)
    EQI_HEAD_LOW (4)          - Lower Headgear (beards, some masks)
    EQI_HEAD_MID (5)          - Middle Headgear (masks, glasses)
    EQI_HEAD_TOP (6)          - Upper Headgear
    EQI_ARMOR (7)             - Armor (jackets, robes)
    EQI_HAND_L (8)            - Left hand (weapons, shields)
    EQI_HAND_R (9)            - Right hand (weapons)
    EQI_COSTUME_HEAD_TOP (10) - Upper Costume Headgear
    EQI_COSTUME_HEAD_MID (11) - Middle Costume Headgear
    EQI_COSTUME_HEAD_LOW (12) - Lower Costume Headgear
    EQI_COSTUME_GARMENT (13)  - Costume Garment
    EQI_AMMO (14)    		  - Arrow/Ammunition
    EQI_SHADOW_ARMOR (15)     - Shadow Armor
    EQI_SHADOW_WEAPON (16)    - Shadow Weapon
    EQI_SHADOW_SHIELD (17)    - Shadow Shield
    EQI_SHADOW_SHOES (18)     - Shadow Shoes
    EQI_SHADOW_ACC_R (19)     - Shadow Accessory 2
    EQI_SHADOW_ACC_L (20)     - Shadow Accessory 1
    
    Notice that a few items occupy several equipment slots, and if the character is
    wearing such an item, 'getequipid' will return its ID number for either slot.
    
    Can be used to check if you have something equipped, or if you haven't got
    something equipped:
    
    	if (getequipid(EQI_HEAD_TOP) == 2234)
    		mes "What a lovely Tiara you have on";
    	else
    		mes "Come back when you have a Tiara on";
    	close;
    
    You can also use it to make sure people don't pass a point before removing an
    item totally from them. Let's say you don't want people to wear Legion Plate
    armor, but also don't want them to equip if after the check, you would do this:
    
    	if (getequipid(EQI_ARMOR) == 2341 || getequipid(EQI_ARMOR) == 2342) {
    		mes "You are wearing some Legion Plate Armor, please drop that in your stash before continuing";
    		close;
    	}
    	// the || is used as an or argument, there is 2341 and 2342 cause there are
    	// two different legion plate armors, one with a slot one without.
    
    	if (countitem(2341) > 0 || countitem(2432) > 0) {
    		mes "You have some Legion Plate Armor in your inventory, please drop that in your stash before continuing";
    		close;
    	}
    	mes "I will lets you pass.";
    	close2;
    	warp "place",50,50;
    	end;

     

×
×
  • Create New...