· 6 years ago · Jan 07, 2020, 06:50 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 callsub L_Check, .rookie, .rookie_ip$;
230 callsub L_Check, .knight, .knight_ip$;
231 callsub L_Check, .baronet, .baronet_ip$;
232 callsub L_Check, .baron, .baron_ip$;
233 callsub L_Check, .viscount, .baron_ip$;
234 callsub L_Check, .count, .count_ip$;
235 callsub L_Check, .marquis, .marquis_ip$;
236 callsub L_Check, .viceroy, .viceroy_ip$;
237 callsub L_Check, .prince, .prince_ip$;
238 callsub L_Check, .elector, .elector_ip$;
239 callsub L_Check, .duke, .duke_ip$;
240 callsub L_Check, .archduke, .archduke_ip, .@val;
241 callsub L_Check, .grand_duke, .grand_duke_ip$;
242 callsub L_Check, .king, .king_ip$;
243 callsub L_Check, .emperor, .emperor_ip$;
244 end;
245L_Check:
246 .@i = inarray(getarg(0), getcharid(3));
247 if ( .@i == -1 ) return;
248 deletearray getelementofarray(getarg(0), .@i), 1;
249 if( $ipcheck ) deletearray getelementofarray(getarg(1), .@i), 1;
250 return;
251}
252
253solommr,0,0,0 script mmr_solo_main -1,{
254OnInstanceInit:
255 ++'round;
256 'manager$ = "solo_mmr";
257 'duration = getvariableofnpc( .duration_solo, 'manager$ );
258 'points = getvariableofnpc( .winpoint_solo, 'manager$ );
259 'id = instance_id();
260 'player_1 = bg_create( strnpcinfo(4), 65, 100, 0, instance_npcname( strnpcinfo(0) )+"::OnRedQuit", instance_npcname( strnpcinfo(0) )+"::OnRedDead" );
261 'player_2 = bg_create( strnpcinfo(4), 134, 100, 1, instance_npcname( strnpcinfo(0) )+"::OnBlueQuit", instance_npcname( strnpcinfo(0) )+"::OnBlueDead" );
262 callfunc "F_ShuffleNumbers", 0, 1, .@r;
263 for ( .@i = 0; .@i < 2; ++.@i ) {
264 attachrid getvariableofnpc( getd( ".aid["+ .@r[.@i] +"]" ), 'manager$ );
265 @mmrqueue = 0;
266 bg_join ( .@i % 2 )? 'player_1 : 'player_2;
267 if ( getcharid(4) == 'player_1 ) {
268 'p1_name$ = strcharinfo(0);
269 'p1_rating = rating_get(0);
270 }
271 if ( getcharid(4) == 'player_2 ) {
272 'p2_name$ = strcharinfo(0);
273 'p2_rating = rating_get(0);
274 }
275 sc_end SC_ALL;
276 percentheal 100, 100;
277 }
278 detachrid;
279 bg_warp 'player_1, strnpcinfo(4), 65, 100;
280 bg_warp 'player_2, strnpcinfo(4), 134, 100;
281 setmapflag strnpcinfo(4), mf_battleground, -1, 2;
282 bg_updatescore strnpcinfo(4), 0, 0;
283 sleep 1234;
284 instance_announce 'id, "First player to get "+ 'points +" points wins the ladder match.", bc_map | bc_blue;
285 sleep 2000;
286 instance_announce 'id, "Round "+ 'round +"... Start! ", bc_map | bc_blue;
287
288
289 sleep 'duration * 60000;
290
291 if ( 'player1_points > 'player2_points ) {
292 'winside = 'player_1;
293 callsub L_win;
294 } else if ( 'player2_points > 'player1_points ) {
295 'winside = 'player_2;
296 callsub L_win;
297 } else if ( 'player1_points == 'player2_points ) {
298 instance_announce 'id, "Battle end as time out", bc_npc | bc_map | bc_blue;
299 sleep 2750;
300 instance_announce 'id, "It's a tie!", bc_npc | bc_map | bc_blue;
301 sleep 1250;
302 callsub L_reward, 'player_1, 1;
303 callsub L_reward, 'player_2, 1;
304 }
305 L_destroy:
306 sleep 5000;
307 bg_destroy 'player_1;
308 bg_destroy 'player_2;
309 mapwarp strnpcinfo(4), "prontera",150,185;
310 sleep 1; // prevent aFree error
311 instance_destroy;
312 end;
313
314L_win:
315 instance_announce 'id, ( ( 'winside == 'player1_points) ? "Player 1" : "Player 2" ) +" Team Won the match !", bc_map | bc_blue;
316 callsub L_reward, ( 'winside == 'player_1) ? 'player_1 : 'player_2, 0;
317 callsub L_reward, ( 'winside == 'player_1) ? 'player_2 : 'player_1, 0;
318 return;
319L_reward:
320 bg_get_data getarg(0), 1;
321 for ( .@i = 0; .@i < $@arenamemberscount; ++.@i ) {
322 attachrid ( $@arenamembers[.@i] );
323 pvprank_getexp ( ( 'winside == getarg(0) ) ? 'p2_rating : 'p1_rating, 32, ( 'winside == getarg(0) ) ? 1 : 2 );
324 if ('winside == getarg(0)) ladder_points();
325 sleep 1;
326 }
327 return;
328
329OnRedDead: callsub L_Dead, 'player_2, "Player 1";
330OnBlueDead: callsub L_Dead, 'player_1, "Player 2";
331L_Dead:
332 instance_announce 'id, getarg(1) +" has died! Round restarts in few sec.", bc_map | bc_blue;
333 ++'round;
334 if( getarg(0) == 'player_1 )
335 ++'player1_points;
336 else if( getarg(0) == 'player_2 )
337 ++'player2_points;
338 bg_updatescore strnpcinfo(4), 'player1_points, 'player2_points;
339 if( 'player1_points == 'points || 'player2_points == 'points ) {
340 'winside = getarg(0);
341 awake instance_npcname( strnpcinfo(0) );
342 end;
343 }
344 sleep2 1250;
345 recovery 3, strnpcinfo(4);
346 bg_warp ( getarg(0) != 'player_1 ) ? 'player_2 : 'player_1, strnpcinfo(4), ( getarg(0) != 'player_1 ) ? 134 : 65, 100;
347 sleep 2000;
348 instance_announce 'id, "Round "+ 'round +"... Start! ", bc_map | bc_blue;
349 end;
350
351OnRedQuit: callsub L_Quit, 'player_1, "Player 1";
352OnBlueQuit: callsub L_Quit, 'player_2, "Player 2";
353L_Quit:
354 if ( $penaltysystem ) {
355 pvpmmr_penalty = gettimetick(2);
356 setquest 70001;
357 }
358 instance_announce 'id, ((getarg(0) == 'player_1 ) ? 'p1_name$ : 'p2_name$) +" has left the game. No rewards.", bc_npc | bc_map | bc_blue;
359 sleep 5000;
360 if ( $penaltysystem ) {
361 instance_announce 'id, "A punishment will be given to players leaving ladder match.", bc_npc | bc_map | bc_blue;
362 sleep 5000;
363 }
364 instance_announce 'id, "Match ends in few seconds.", bc_npc | bc_map | bc_blue;
365 sleep 2000;
366 callsub L_destroy;
367 end;
368}
369
370partymmr,102,77,0 script #mmrwall0 1905,{ end; }
371partymmr,101,77,0 duplicate(#mmrwall0) #mmrwall1 1905
372partymmr,100,77,0 duplicate(#mmrwall0) #mmrwall2 1905
373partymmr,99,77,0 duplicate(#mmrwall0) #mmrwall3 1905
374partymmr,98,77,0 duplicate(#mmrwall0) #mmrwall4 1905
375partymmr,97,77,0 duplicate(#mmrwall0) #mmrwall5 1905
376partymmr,102,122,0 duplicate(#mmrwall0) #mmrwall6 1905
377partymmr,101,122,0 duplicate(#mmrwall0) #mmrwall7 1905
378partymmr,100,122,0 duplicate(#mmrwall0) #mmrwall8 1905
379partymmr,99,122,0 duplicate(#mmrwall0) #mmrwall9 1905
380partymmr,98,122,0 duplicate(#mmrwall0) #mmrwall10 1905
381partymmr,97,122,0 duplicate(#mmrwall0) #mmrwall11 1905