viewing paste topic/4746- scuffle-event | Athena

Posted on the | Last edited on
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90
-   script  scuffle -1,{
OnInit:
    .players = 2; // how many players are select for the scuffle
    .idle = 30; // only pick those who were active in last 30 seconds for this scuffle
    .level = 55; // only pick those who are higher than this level for this scuffle
    .map$ = "guild_vs2"; // use an empty map and small enough for this scuffle
    .lasting = 10 *60; // how long will the duel last ... in seconds ...
    setarray .reward, 502,3, 501,1; // reward to the winner
 
    setarray .@mapflag,
        mf_pvp,
        mf_pvp_noparty,
        mf_pvp_noguild,
        mf_nowarp,
        mf_nowarpto,
        mf_nomemo,
        mf_nosave,
        mf_noreturn,
        mf_noteleport,
        mf_noicewall,
        mf_nopenalty;
    .@mf_size = getarraysize( .@mapflag );
    for ( .@i = 0; .@i < .@mf_size; .@i++ )
        setmapflag .map$, .@mapflag[.@i];
    mapwarp .map$, "prontera", 150,150;
    .rewardsize = getarraysize(.reward);
    end;
OnClock0000: // time to start ...
OnClock0315:
OnClock0600:
OnClock0900:
    .@nb = query_sql( "select account_id, name from `char` where online = 1 order by rand() limit 100", .@aid, .@name$ );
    for ( .@i = 0; .@i < .@nb; .@i++ ) {
        attachrid .@aid[.@i];
        if ( !checkvending() && !checkchatting() && !getmapflag( strcharinfo(3), mf_nowarp ) && !getmapflag( strcharinfo(3), mf_nowarpto ) && !getgmlevel() && checkidle() < .idle && BaseLevel >= .level ) { // not vendor, not inside an event map and excluding GMs
            .@duelid[.@c] = .@aid[.@i];
            .@duelname$[.@c] = .@name$[.@i];
            .@c++;
            if ( .@c == .players ) {
                break;
            }
        }
    }
    if ( .@c < .players ) end; // can't even find enough players
    announce "["+ implode( .@duelname$, "] and [" )+"] has started a scuffle", bc_all;
    for ( .@i = 0; .@i < .players; .@i++ ) {
        .duel[.@i] = .@duelid[.@i];
        getmapxy .@map$, .@x, .@y, 0, .@duelname$[.@i];
        .duelmap$[.@i] = .@map$;
        .duelx[.@i] = .@x;
        .duely[.@i] = .@y;
        attachrid .@duelid[.@i];
        warp .map$, 0,0;
    }
    sleep .lasting * 1000;
    .@size = getarraysize( .duel );
    if ( .@size > 1 ) {
        announce "The scuffle drag on for too long, nobody wins", bc_all;
        for ( .@i = 0; .@i < .@size; .@i++ ) {
            attachrid .duel[.@i];
            warp .duelmap$[.@i], .duelx[.@i], .duely[.@i];
        }
    }
    else {
        attachrid .duel;
        announce strcharinfo(0) +" won the scuffle !", bc_all;
        for ( .@i = 0; .@i < .rewardsize; .@i += 2 )
            getitem .reward[.@i], .reward[.@i +1];
        warp .duelmap$, .duelx, .duely;
    }
    deletearray .duel;
    deletearray .duelmap$;
    deletearray .duelx;
    deletearray .duely;
    end;
OnPCLogoutEvent:
OnPCDieEvent:
    if ( strcharinfo(3) != .map$ ) end;
    while ( getcharid(3) != .duel[.@i] && .@i < .players ) .@i++;
    if ( .@i == .players ) end;
    attachrid .duel[.@i];
    warp .duelmap$[.@i], .duelx[.@i], .duely[.@i];
    deletearray .duel[.@i], 1;
    deletearray .duelmap$[.@i], 1;
    deletearray .duelx[.@i], 1;
    deletearray .duely[.@i], 1;
    if ( getarraysize( .duel ) > 1 ) end;
    awake strnpcinfo(0);
    end;
}
Viewed 1430 times, submitted by AnnieRuru.