· 6 years ago · Jan 07, 2020, 06:42 AM
1- script Pvp_Rank_Manager -1,{
2OnInit:
3 .npcname$ = "[ "+StrColor(strnpcinfo(0),"RED")+" ]";
4 // Rank Exp Points
5 setarray .rp_next,
6 -1, // default
7 1600,
8 1800,
9 2000,
10 2200,
11 2400,
12 2600,
13 2800,
14 3000,
15 3200,
16 3400,
17 3600,
18 3800,
19 4000,
20 4200;
21 // Rank id from lowest to highest
22 setarray .rank_id,
23 1,
24 2,
25 3,
26 4,
27 5,
28 6,
29 7,
30 8,
31 9,
32 10,
33 11,
34 12,
35 13,
36 14,
37 15;
38 // Rank Titles
39 setarray .title$,
40 "Rookie",
41 "Knight",
42 "Baronet",
43 "Baron",
44 "Viscount",
45 "Count",
46 "Marquis",
47 "Viceroy",
48 "Prince",
49 "Elector",
50 "Duke",
51 "Archduke",
52 "Grand Duke",
53 "King",
54 "Emperor";
55 setwall "partymmr",102,122,6,2,0,"pvpmmr_wall_1";
56 setwall "partymmr",102,77,6,2,0,"pvpmmr_wall_2";
57 end;
58}
59
60payon,140,117,0 script Solo MMR::solo_mmr 100,{
61 callsub OnTalk;
62 end;
63
64OnInit:
65 // ---------------- //
66 // General Settings //
67 // ---------------- //
68
69 // Penalize player once leaving an mmr match?
70 // true = on || false = off
71 // penalty would be as follows :
72 // 24 hours lock down: cannot join any mmr matches for 1 day.
73 $penaltysystem = true;
74
75 // ip check?
76 // true = on || false = off
77 $ipcheck = false;
78
79 // Minimum level for the characters to be able to join mmr matches
80 // defaulted to 1/1 for testing..
81 setarray $@min_level,
82 1, // Min base level
83 1; // Min job level
84
85 // Wins needed to gain PVP Ladder points
86 // ( default : 8 )
87 .ladder_win_req = 1;
88
89 // How much PVP Ladder points gain
90 // calculation = 100 + ( 100 * rank )
91 // ( default : 100 )
92 .ladder_point_gain = 100;
93
94 // ----------------- //
95 // Solo MMR Settings //
96 // ----------------- //
97
98 // duration of the entire event
99 // (default : 5 mins)
100 .duration_solo = 5;
101
102 // how many points need to win?
103 // (default = 2 points for a 3 round match)
104 .winpoint_solo = 2;
105
106 // ----------------- //
107 // Team MMR Settings //
108 // ----------------- //
109
110 // duration of the entire event
111 // (default : 5 mins)
112 .duration_team = 5;
113
114 // how many points need to win?
115 // (default = 2 points for a 3 round match)
116 .winpoint_team = 2;
117
118 // minimum players per team to activate the event.
119 // (default = 2 [2v2])
120 .minplayer2start = 5;
121
122 // Disables the ranking difference
123 // set to true if you want to enable matchmaking with different ranks
124 .mmr = false;
125
126 // Auto-generates the pvp_rating table..
127 query_sql ("CREATE TABLE IF NOT EXISTS `pvp_rating` ( `account_id` int(11) unsigned NOT NULL, `char_id` int(11) unsigned NOT NULL, `char_name` varchar(30) NOT NULL default 'Unknown', `rating` int(11) default '0', PRIMARY KEY ( `char_id` ),KEY (`rating`)) ENGINE=InnoDB;");
128 end;
129
130OnTalk:
131 set .@pvpmmr_penalty,checkquest(70001,PLAYTIME); // 1 day - penalty
132 switch (.@pvpmmr_penalty) {
133 case -1:
134 if ( BaseLevel < $@min_level[0] || JobLevel < $@min_level[1] ) {
135 mes "Your base/job level wouldn't meet the requirements ("+ $@min_level[0] +"/"+ $@min_level[1] +").";
136 close;
137 }
138 if ( agitcheck() || agitcheck2() ) {
139 mes "You cannot use @joinbg while WoE is active";
140 close;
141 }
142 if ( getcharid(4) ) {
143 mes "You cannot use command while in a battleground.";
144 mes "Relog to continue.";
145 close;
146 }
147 if ( @mmrqueue == 2 ) {
148 mes "You already join the team mmr queue.";
149 mes "Go to team mmr npc and remove your self from the queue.";
150 close;
151 }
152 if ( rating_get(0) < 1600 && .mmr ) callsub L_Start, .rookie, .rookie_ip$;
153 else if ( rating_get(0) >= 1600 && rating_get(0) < 2000 && .mmr ) callsub L_Start, .reg_pro, .reg_pro_ip$;
154 else if ( rating_get(0) >= 2000 && .mmr )callsub L_Start, .vet_elite, .vet_elite_ip$;
155 else callsub L_Start, .regular, .regular_ip$;
156 break;
157 case 0:
158 case 1:
159 set .@penalty_lim_time,pvpmmr_penalty+86400; // 24 hours
160 set .@penalty_cur_time,gettimetick(2);
161 set .@penalty_ent_t,(.@penalty_lim_time - .@penalty_cur_time);
162 set .@penalty_h,(.@penalty_ent_t / 3600);
163 set .@penalty_m,(.@penalty_ent_t - (.@penalty_h * 3600)) / 60;
164 set .@penalty_s,.@penalty_ent_t - ((.@penalty_h * 3600) + (.@penalty_m * 60));
165 mes "You left in the middle of a ranked match.";
166 next;
167 mes "As penalty, you can only enter again after:";
168 mes "~ "+ .@penalty_h + "hours " + .@penalty_m + "minutes " + .@penalty_s + "seconds";
169 close;
170 case 2:
171 pvpmmr_penalty = 0;
172 erasequest 30002;
173 mes "^0000ffYou can join a ranked game again.^000000";
174 close;
175 }
176 end;
177
178L_Start:
179 if( $ipcheck ) {
180 for(.@i = 0; .@i < getarraysize(getarg(1)); .@i++) {
181 if ( getelementofarray(getarg(1), .@i) == getcharip() ) {
182 mes "Same IP had already registered";
183 close;
184 }
185 }
186 }
187 mes "Want to join a ranked solo match?";
188 next;
189 while ( getelementofarray(getarg(0), .@i) != getcharid(3) && .@i < 2 ) ++.@i;
190 if ( .@i < 2 ) {
191 mes "You already join the queue.";
192 mes "Do yo want to leave the queue?";
193 next;
194 if ( select("Yes","No")==2 )close;
195 mes "You have successfully been removed from the queue";
196 close2;
197 @mmrqueue = 0;
198 callsub OnLeaveQueue;
199 end;
200 }
201 select "Join";
202 mes "you have to stick to this map";
203 close2;
204 @mmrqueue = 1;
205 if( $ipcheck ) set getelementofarray(getarg(1), getarraysize(getarg(1))), getcharip();
206 set getelementofarray(getarg(0), getarraysize(getarg(0))), getcharid(3);
207 if ( !isloggedin( getelementofarray(getarg(0), 0) ) ) {
208 deletearray getelementofarray(getarg(0), 0), 1;
209 if( $ipcheck ) deletearray getelementofarray(getarg(1), 0), 1;
210 }
211 else {
212 attachrid getelementofarray(getarg(0), 0);
213 if ( strcharinfo(3) != strnpcinfo(4) ) {
214 deletearray getelementofarray(getarg(0), 0), 1;
215 if( $ipcheck ) deletearray getelementofarray(getarg(1), 0), 1;
216 }
217 }
218 detachrid;
219 if ( getelementofarray(getarg(0), 0) && getelementofarray(getarg(0), 1) ) {
220 copyarray .aid[0], getelementofarray(getarg(0), 0), 2;
221 instance_create( "SOLO_MMR", IM_NONE );
222 deletearray getarg(0);
223 if( $ipcheck ) deletearray getarg(1);
224 }
225 end;
226
227OnPCLogoutEvent:
228OnLeaveQueue:
229 .@val = getcharid(3);
230 callsub L_Check, .rookie, .rookie_ip$, .@val;
231 callsub L_Check, .knight, .knight_ip$, .@val;
232 callsub L_Check, .baronet, .baronet_ip$, .@val;
233 callsub L_Check, .baron, .baron_ip$, .@val;
234 callsub L_Check, .viscount, .baron_ip$, .@val;
235 callsub L_Check, .count, .count_ip$, .@val;
236 callsub L_Check, .marquis, .marquis_ip$, .@val;
237 callsub L_Check, .viceroy, .viceroy_ip$, .@val;
238 callsub L_Check, .prince, .prince_ip$, .@val;
239 callsub L_Check, .elector, .elector_ip$, .@val;
240 callsub L_Check, .duke, .duke_ip$, .@val;
241 callsub L_Check, .archduke, .archduke_ip, .@val;
242 callsub L_Check, .grand_duke, .grand_duke_ip$, .@val;
243 callsub L_Check, .king, .king_ip$, .@val;
244 callsub L_Check, .emperor, .emperor_ip$, .@val;
245 end;
246L_Check:
247 .@val = getarg(2);
248 if ( getelementofarray(getarg(0), 0) == .@val ) {
249 deletearray getelementofarray(getarg(0), 0), 1;
250 if( $ipcheck ) deletearray getelementofarray(getarg(1), 0), 1;
251 }
252 end;
253}
254
255solommr,0,0,0 script mmr_solo_main -1,{
256OnInstanceInit:
257 ++'round;
258 'manager$ = "solo_mmr";
259 'duration = getvariableofnpc( .duration_solo, 'manager$ );
260 'points = getvariableofnpc( .winpoint_solo, 'manager$ );
261 'id = instance_id();
262 'player_1 = bg_create( strnpcinfo(4), 65, 100, 0, instance_npcname( strnpcinfo(0) )+"::OnRedQuit", instance_npcname( strnpcinfo(0) )+"::OnRedDead" );
263 'player_2 = bg_create( strnpcinfo(4), 134, 100, 1, instance_npcname( strnpcinfo(0) )+"::OnBlueQuit", instance_npcname( strnpcinfo(0) )+"::OnBlueDead" );
264 callfunc "F_ShuffleNumbers", 0, 1, .@r;
265 for ( .@i = 0; .@i < 2; ++.@i ) {
266 attachrid getvariableofnpc( getd( ".aid["+ .@r[.@i] +"]" ), 'manager$ );
267 @mmrqueue = 0;
268 bg_join ( .@i % 2 )? 'player_1 : 'player_2;
269 if ( getcharid(4) == 'player_1 ) {
270 'p1_name$ = strcharinfo(0);
271 'p1_rating = rating_get(0);
272 }
273 if ( getcharid(4) == 'player_2 ) {
274 'p2_name$ = strcharinfo(0);
275 'p2_rating = rating_get(0);
276 }
277 sc_end SC_ALL;
278 percentheal 100, 100;
279 }
280 detachrid;
281 bg_warp 'player_1, strnpcinfo(4), 65, 100;
282 bg_warp 'player_2, strnpcinfo(4), 134, 100;
283 setmapflag strnpcinfo(4), mf_battleground, -1, 2;
284 bg_updatescore strnpcinfo(4), 0, 0;
285 sleep 1234;
286 instance_announce 'id, "First player to get "+ 'points +" points wins the ladder match.", bc_map | bc_blue;
287 sleep 2000;
288 instance_announce 'id, "Round "+ 'round +"... Start! ", bc_map | bc_blue;
289
290
291 sleep 'duration * 60000;
292
293 if ( 'player1_points > 'player2_points ) {
294 'winside = 'player_1;
295 callsub L_win;
296 } else if ( 'player2_points > 'player1_points ) {
297 'winside = 'player_2;
298 callsub L_win;
299 } else if ( 'player1_points == 'player2_points ) {
300 instance_announce 'id, "Battle end as time out", bc_npc | bc_map | bc_blue;
301 sleep 2750;
302 instance_announce 'id, "It's a tie!", bc_npc | bc_map | bc_blue;
303 sleep 1250;
304 callsub L_reward, 'player_1, 1;
305 callsub L_reward, 'player_2, 1;
306 }
307 L_destroy:
308 sleep 5000;
309 bg_destroy 'player_1;
310 bg_destroy 'player_2;
311 mapwarp strnpcinfo(4), "prontera",150,185;
312 sleep 1; // prevent aFree error
313 instance_destroy;
314 end;
315
316L_win:
317 instance_announce 'id, ( ( 'winside == 'player1_points) ? "Player 1" : "Player 2" ) +" Team Won the match !", bc_map | bc_blue;
318 callsub L_reward, ( 'winside == 'player_1) ? 'player_1 : 'player_2, 0;
319 callsub L_reward, ( 'winside == 'player_1) ? 'player_2 : 'player_1, 0;
320 return;
321L_reward:
322 bg_get_data getarg(0), 1;
323 for ( .@i = 0; .@i < $@arenamemberscount; ++.@i ) {
324 attachrid ( $@arenamembers[.@i] );
325 pvprank_getexp ( ( 'winside == getarg(0) ) ? 'p2_rating : 'p1_rating, 32, ( 'winside == getarg(0) ) ? 1 : 2 );
326 if ('winside == getarg(0)) ladder_points();
327 sleep 1;
328 }
329 return;
330
331OnRedDead: callsub L_Dead, 'player_2, "Player 1";
332OnBlueDead: callsub L_Dead, 'player_1, "Player 2";
333L_Dead:
334 instance_announce 'id, getarg(1) +" has died! Round restarts in few sec.", bc_map | bc_blue;
335 ++'round;
336 if( getarg(0) == 'player_1 )
337 ++'player1_points;
338 else if( getarg(0) == 'player_2 )
339 ++'player2_points;
340 bg_updatescore strnpcinfo(4), 'player1_points, 'player2_points;
341 if( 'player1_points == 'points || 'player2_points == 'points ) {
342 'winside = getarg(0);
343 awake instance_npcname( strnpcinfo(0) );
344 end;
345 }
346 sleep2 1250;
347 recovery 3, strnpcinfo(4);
348 bg_warp ( getarg(0) != 'player_1 ) ? 'player_2 : 'player_1, strnpcinfo(4), ( getarg(0) != 'player_1 ) ? 134 : 65, 100;
349 sleep 2000;
350 instance_announce 'id, "Round "+ 'round +"... Start! ", bc_map | bc_blue;
351 end;
352
353OnRedQuit: callsub L_Quit, 'player_1, "Player 1";
354OnBlueQuit: callsub L_Quit, 'player_2, "Player 2";
355L_Quit:
356 if ( $penaltysystem ) {
357 pvpmmr_penalty = gettimetick(2);
358 setquest 70001;
359 }
360 instance_announce 'id, ((getarg(0) == 'player_1 ) ? 'p1_name$ : 'p2_name$) +" has left the game. No rewards.", bc_npc | bc_map | bc_blue;
361 sleep 5000;
362 if ( $penaltysystem ) {
363 instance_announce 'id, "A punishment will be given to players leaving ladder match.", bc_npc | bc_map | bc_blue;
364 sleep 5000;
365 }
366 instance_announce 'id, "Match ends in few seconds.", bc_npc | bc_map | bc_blue;
367 sleep 2000;
368 callsub L_destroy;
369 end;
370}
371
372partymmr,102,77,0 script #mmrwall0 1905,{ end; }
373partymmr,101,77,0 duplicate(#mmrwall0) #mmrwall1 1905
374partymmr,100,77,0 duplicate(#mmrwall0) #mmrwall2 1905
375partymmr,99,77,0 duplicate(#mmrwall0) #mmrwall3 1905
376partymmr,98,77,0 duplicate(#mmrwall0) #mmrwall4 1905
377partymmr,97,77,0 duplicate(#mmrwall0) #mmrwall5 1905
378partymmr,102,122,0 duplicate(#mmrwall0) #mmrwall6 1905
379partymmr,101,122,0 duplicate(#mmrwall0) #mmrwall7 1905
380partymmr,100,122,0 duplicate(#mmrwall0) #mmrwall8 1905
381partymmr,99,122,0 duplicate(#mmrwall0) #mmrwall9 1905
382partymmr,98,122,0 duplicate(#mmrwall0) #mmrwall10 1905
383partymmr,97,122,0 duplicate(#mmrwall0) #mmrwall11 1905