Kembali ke Beranda
Gistify Snippet
kyiov
Feb 16·1 file(s)
Public

Uploaded by Joy MD - Bot | 16/2/2026, 23.24.33

synced from github gist dragRace.js

#api
dragRace.jsjavascript
293 baris
1/*
2 * ───────────────────────────
3 * 🟢 JOY MD - SOURCE CODE
4 * ───────────────────────────
5 * 👤 Channel : https://shorturl.at/ce5eX
6 * 📅 Fetched : 16/2/2026, 23.22.46
7 * 📂 File : drag_race.js
8 * ───────────────────────────
9 */
10
11/**
12 * @module plugins/game/drag_race
13 * @description Game Drag Race Motor (Animation + Events + Lobby Management)
14 */
15
16import { db, saveDb } from "#system/db/data.js";
17
18const sleep = ms => new Promise(resolve => setTimeout(resolve, ms));
19const toRupiah = n => "Rp " + n.toLocaleString("id-ID");
20
21const sessions = {};
22
23const motors = [
24 { name: "Ninja ZX-25R", icon: "🏍️", speed: 96 },
25 { name: "Mio Mberrr", icon: "🛵", speed: 90 },
26 { name: "RX King Cobra", icon: "🏍️", speed: 98 },
27 { name: "Satria Fucc", icon: "🏍️", speed: 94 },
28 { name: "Beat Karbu", icon: "🛵", speed: 88 },
29 { name: "CBR 250RR", icon: "🏍️", speed: 95 },
30 { name: "Jupie Burhan", icon: "🏍️", speed: 93 },
31 { name: "Vario 160", icon: "🛵", speed: 89 },
32 { name: "Aerox Ngab", icon: "🛵", speed: 91 },
33 { name: "Ducati V4", icon: "🏍️", speed: 99 },
34 { name: "Bebek Goreng", icon: "🏍️", speed: 87 },
35 { name: "NMAX Turbo", icon: "🛵", speed: 90 }
36];
37
38const randomEvents = [
39 { msg: "🚀 Melesat kencang!", boost: 12 },
40 { msg: "💨 Curi angin lawan!", boost: 8 },
41 { msg: "🔥 Wheelie dikit!", boost: 5 },
42 { msg: "⚠️ Ada polisi tidur!", boost: -5 },
43 { msg: "🛑 Lampu merah!", boost: -8 },
44 { msg: "👵 Disalip Emak-emak!", boost: -10 },
45 { msg: "👮 ADA RAZIA POLISI! Panik!", boost: -15 },
46 { msg: "🍜 Nabrak gerobak bakso!", boost: -20 },
47 { msg: "🔩 Rantai putus!", boost: -12 },
48 { msg: "🐕 Dikejar anjing!", boost: 15 },
49 { msg: "⛽ Bensin habis!", boost: -25 }
50];
51
52let handler = async (m, { conn, args, usedPrefix, command }) => {
53 const id = m.chat;
54 const user =
55 db().key[Object.keys(db().key).find(k => db().key[k].jid === m.sender)];
56
57 if (!sessions[id]) {
58 if (["join", "start", "leave", "delete"].includes(args[0])) {
59 return m.reply(
60 `❌ Belum ada sesi Drag Race.\nKetik *${usedPrefix + command} <bet>* untuk membuat room.\nContoh: *${usedPrefix + command} 1000*`
61 );
62 }
63
64 let bet = 0;
65 if (args[0] && /^\d+$/.test(args[0])) bet = parseInt(args[0]);
66
67 if (bet > 0 && user.money < bet) {
68 return m.reply(
69 `❌ Uang kamu kurang! Butuh ${toRupiah(bet)} untuk taruhan.`
70 );
71 }
72
73 sessions[id] = {
74 host: m.sender,
75 state: "LOBBY",
76 bet: bet,
77 players: [],
78 maxPlayers: 4,
79 created: Date.now()
80 };
81
82 let txt = `🏁 *DRAG RACE CHAMPIONSHIP* 🏁\n`;
83 txt += `━━━━━━━━━━━━━━━━━━━\n`;
84 txt += `💰 Taruhan: ${bet === 0 ? "Gratis" : toRupiah(bet)}\n`;
85 txt += `👥 Slot: 4 Pemain\n\n`;
86 txt += `*DAFTAR MOTOR:*\n`;
87 motors.forEach((m, i) => {
88 txt += `${i + 1}. ${m.name} ${m.icon} (Spd: ${m.speed})\n`;
89 });
90 txt += `\n*COMMANDS:*\n`;
91 txt += `🟢 *${usedPrefix + command} join <nomor>* : Bergabung\n`;
92 txt += `🔴 *${usedPrefix + command} leave* : Keluar\n`;
93 txt += `🏁 *${usedPrefix + command} start* : Mulai (Host)\n`;
94 txt += `🗑️ *${usedPrefix + command} delete* : Hapus Sesi\n`;
95 txt += `━━━━━━━━━━━━━━━━━━━`;
96
97 return m.reply(txt);
98 }
99
100 const session = sessions[id];
101
102 // --- JOIN SESSION ---
103 if (args[0] === "join") {
104 if (session.state !== "LOBBY")
105 return m.reply("❌ Balapan sudah dimulai!");
106 if (session.players.find(p => p.id === m.sender))
107 return m.reply("❌ Kamu sudah bergabung.");
108 if (session.players.length >= session.maxPlayers)
109 return m.reply("❌ Slot penuh!");
110
111 const motorIdx = parseInt(args[1]) - 1;
112 if (isNaN(motorIdx) || !motors[motorIdx])
113 return m.reply("⚠️ Pilih nomor motor yang valid (1-12).");
114
115 if (session.bet > 0) {
116 if (user.money < session.bet)
117 return m.reply("❌ Uang tidak cukup.");
118 user.money -= session.bet;
119 saveDb();
120 }
121
122 const selectedMotor = motors[motorIdx];
123 session.players.push({
124 id: m.sender,
125 name: m.pushName || "Racer",
126 motor: selectedMotor,
127 pos: 0,
128 event: ""
129 });
130
131 let msg = `✅ *${m.pushName}* naik *${selectedMotor.name}* ${selectedMotor.icon}`;
132 msg +=
133 session.players.length === session.maxPlayers
134 ? `\n\n🚦 Room Penuh! Host ketik *${usedPrefix + command} start*`
135 : `\n(${session.players.length}/${session.maxPlayers} Players)`;
136 return m.reply(msg);
137 }
138
139 // --- LEAVE SESSION ---
140 if (args[0] === "leave") {
141 if (session.state !== "LOBBY")
142 return m.reply("❌ Tidak bisa keluar saat balapan berlangsung!");
143
144 const index = session.players.findIndex(p => p.id === m.sender);
145 if (index === -1) return m.reply("❌ Kamu belum bergabung.");
146
147 // Refund
148 if (session.bet > 0) {
149 user.money += session.bet;
150 saveDb();
151 }
152
153 session.players.splice(index, 1);
154
155 // If host leaves, delete session? Or reassign?
156 // For simplicity: If session empty, delete. If host leaves, maybe keep?
157 // Let's keep it simple: Just remove player.
158
159 if (session.players.length === 0) {
160 delete sessions[id];
161 return m.reply("✅ Kamu keluar. Room dihapus karena kosong.");
162 }
163
164 return m.reply(`✅ Berhasil keluar. Uang taruhan dikembalikan.`);
165 }
166
167 // --- DELETE SESSION ---
168 if (args[0] === "delete") {
169 if (session.state !== "LOBBY")
170 return m.reply("❌ Balapan sudah berjalan!");
171 if (m.sender !== session.host && !m.isOwner)
172 return m.reply("❌ Hanya Host yang bisa menghapus sesi.");
173
174 // Refund All
175 if (session.bet > 0) {
176 for (let p of session.players) {
177 const pUserKey = Object.keys(db().key).find(
178 k => db().key[k].jid === p.id
179 );
180 if (pUserKey) {
181 db().key[pUserKey].money += session.bet;
182 }
183 }
184 saveDb();
185 }
186
187 delete sessions[id];
188 return m.reply("✅ Sesi balapan dibubarkan & uang dikembalikan.");
189 }
190
191 // --- START RACE ---
192 if (args[0] === "start") {
193 if (session.state !== "LOBBY") return;
194 if (m.sender !== session.host)
195 return m.reply("❌ Hanya Host yang bisa memulai balapan!");
196 if (session.players.length < 2)
197 return m.reply("⚠️ Minimal 2 pemain untuk gas!");
198
199 session.state = "RACING";
200
201 let raceMsg = await m.reply("🚦 *READY...*");
202 await sleep(1000);
203 await conn.sendMessage(id, { text: "🟡 *SET...*", edit: raceMsg.key });
204 await sleep(1000);
205 await conn.sendMessage(id, { text: "🟢 *GO!!!*", edit: raceMsg.key });
206
207 const trackLength = 100;
208 let winner = null;
209
210 while (!winner) {
211 let board = `🏁 *DRAG RACE LIVE* 🏁\n━━━━━━━━━━━━━━━━━━━\n\n`;
212
213 for (let p of session.players) {
214 // Movement
215 let move = p.motor.speed / 5 + Math.random() * 10;
216
217 // Event Chance
218 if (Math.random() < 0.2) {
219 const ev =
220 randomEvents[
221 Math.floor(Math.random() * randomEvents.length)
222 ];
223 move += ev.boost;
224 p.event = ev.msg;
225 } else {
226 p.event = "";
227 }
228
229 p.pos += move;
230 if (p.pos < 0) p.pos = 0;
231
232 if (p.pos >= trackLength && !winner) winner = p;
233
234 // Visual
235 const percent = Math.min(p.pos, trackLength);
236 const filledLen = Math.floor((percent / trackLength) * 15);
237 let visual = "";
238 for (let k = 0; k < 15; k++)
239 visual += k === filledLen ? p.motor.icon : "═";
240 visual += "🏁";
241
242 board += `${visual} *${p.name}*\n`;
243 if (p.event) board += ` └ ${p.event}\n`;
244 }
245
246 board += `\n━━━━━━━━━━━━━━━━━━━`;
247
248 await conn.sendMessage(id, { text: board, edit: raceMsg.key });
249 await sleep(1500);
250 }
251
252 // --- WINNER ---
253 const totalPot = session.bet * session.players.length;
254 let prizeTxt = "";
255
256 if (session.bet > 0) {
257 const winnerKey = Object.keys(db().key).find(
258 k => db().key[k].jid === winner.id
259 );
260 const winnerData = db().key[winnerKey];
261 if (winnerData) {
262 winnerData.money += totalPot;
263 saveDb();
264 }
265 prizeTxt = `\n💰 *JACKPOT:* ${toRupiah(totalPot)}`;
266 }
267
268 const txt =
269 `🏆 *WINNER ANNOUNCEMENT* 🏆\n` +
270 `━━━━━━━━━━━━━━━━━━━\n` +
271 `🥇 *JUARA 1:* ${winner.name}\n` +
272 `🏍️ *Motor:* ${winner.motor.name}\n` +
273 `${prizeTxt}\n` +
274 `━━━━━━━━━━━━━━━━━━━\n` +
275 `_Ketik .drag untuk main lagi_`;
276
277 await conn.sendMessage(
278 id,
279 { text: txt, mentions: session.players.map(p => p.id) },
280 { quoted: m }
281 );
282
283 delete sessions[id];
284 }
285};
286
287handler.help = ["drag", "dragrace"];
288handler.tags = ["game"];
289handler.command = ["drag", "dragrace"];
290handler.group = true;
291
292export default handler;
293
Diskusi & Komentar0

Belum ada komentar — jadilah yang pertama memberikan masukan atau diskusi kode.

Masuk dengan akun GitHub untuk menulis komentar dan berdiskusi.