Hat Dash White Hat Hall of Fame dan Penyegaran Papan Peringkat
Beberapa hari yang lalu, saya meminta bantuan untuk menemukan cara mencegah (atau setidaknya mempersulit) orang-orang curang di Hat Dash. Saya ingin menyampaikan teriakan kepada semua pengguna yang telah membantu sejauh ini - Anda dapat melihatnya di Hall of Fame White Hat baru yang ada di bagian bawah Papan Peringkat Hat Dash. Masing-masing pengguna ini mengungkap beberapa kelemahan dalam perlindungan game yang kemudian telah diatasi (di klien, server, atau keduanya). Semua pengguna ini juga akan menerima hadiah hadiah, serta topi baru khusus (Pembela Unicorn).
Sejak posting dibuat, saya merilis versi baru dari kontrol anti-curang dan heuristik untuk Hat Dash, yang menampilkan perubahan pada klien dan server. Semuanya pasti tidak 100% aman. Mengetahui bagaimana itu dibangun, saya pasti bisa menemukan cara untuk mendapatkan skor palsu (dan saya yakin beberapa dari Anda akan mencoba melakukannya). Namun, karena sekarang ada mekanisme larangan otomatis pengguna yang cukup agresif, akan sangat mudah untuk mendapatkan banned jika Anda mulai bermain-main dengan berbagai hal, jadi: caveat emptor . Sekarang Anda juga dapat memeriksa status larangan Anda .
Yang mengatakan, jika Anda dapat menipu dengan sistem baru (cheat = berhasil mendapatkan skor tidak sah ke Papan Peringkat, dan dapat melaporkan bagaimana Anda melakukannya; tidak sah = memainkan game atau mengakses API melalui cara apa pun lainnya daripada menggunakan spasi / panah atas / ketuk untuk bermain game) dan ingin mendapatkan hat / bounty / hof, jangan ragu untuk mempostingnya di bawah atau di postingan asli (hanya jawaban yang diposting hingga akhir 30 Desember yang akan dipertimbangkan , penghargaan atas kebijaksanaan saya).
Dan jika Anda telah dilarang, dan masih ingin melihat apakah Anda dapat mengalahkan sistem, Hat Dash sekarang akan mencetak di konsol Anda setelah setiap permainan satu baris [Date] | Is Game Suspect | (true/false)
untuk memberi tahu Anda jika ada sesuatu yang tertangkap dalam permainan (Catatan: tidak semua game yang dicurigai akan menyebabkan larangan otomatis).
Dengan peningkatan sistem anti-cheat, daftar Statistik Keseluruhan tidak lagi digunakan. Sekarang ada di bagian bawah Papan Peringkat. Sebagai gantinya di bagian atas papan peringkat adalah bagian Statistik Keseluruhan baru (dari 2020-12-22) (jika Anda dapat memikirkan nama yang lebih baik, beri tahu saya), yang hanya akan menyertakan skor mulai hari ini dan seterusnya .
Semoga peluang selalu menguntungkan Anda & selamat melompat.
(Oh, dan jika Anda ingin mendapatkan topi rahasia baru tetapi tidak ingin menjadi penipu topi putih, pantau terus… )
Pembaruan: Lineup White Hat Hall of Fame terakhir sekarang ditetapkan, terima kasih semua telah berpartisipasi!
Jawaban
Dalam obrolan, saya mengatakan bahwa, saya tidak akan menipu lagi , tetapi saya tidak bisa menahan diri untuk mencoba metode ini dan itu berhasil.
setInterval(function() {
Runner.instance_.horizon.obstacles[0].collisionBoxes = [];
},200);
Saya mengosongkan kotak tabrakan setiap 200 milidetik dan unicorn kami melewatinya. Tetapi saya pikir Anda memeriksa jumlah lompatan, jadi saya melompat setiap kali saya melihat rintangan meskipun tidak perlu.
PS Setelah perbuatan saya, Anda bebas untuk mencekal saya sekali dan untuk selamanya
Saya telah menemukan cara untuk mengalahkan sistem dan mendapatkan skor tinggi tanpa bermain sesuai aturan. Saya dilarang dari papan peringkat jadi saya tidak bisa mendapatkan skor di sana, tetapi pesan konsol browser mengonfirmasi bahwa permainan itu tidak dicurigai.
Saya tidak terlalu akrab dengan javascript jadi mungkin milik saya bukanlah metode terbaik untuk melakukan apa yang saya lakukan, tetapi karena berhasil, saya tidak akan membuang waktu mencari tahu cara yang benar untuk melakukan ini.
Pada dasarnya, Anda harus memulai permainan dan menabrak rintangan. Saat permainan berakhir, masuk
Runner.instance_.horizon.obstacles[0].typeConfig.yPos = 1337
ke dalam konsol browser. Kemudian mulai lagi, tekan rintangan lain dan masukkan kode yang sama ke konsol. Ulangi sampai Anda berhenti mendapatkan rintangan lagi (jika semuanya bekerja dengan baik Anda harus melakukan ini tiga kali, dan ketiga kalinya rintangan datang setelah beberapa saat, jadi Anda harus melompat seolah-olah Anda menghindari rintangan nyata untuk menghindari tersandung. sistem anti-cheat). Sekarang Anda dapat memainkan game tanpa rintangan, tetapi untuk mengelabui sistem anti-cheat Anda harus terus melompat dan merunduk seolah-olah Anda benar-benar menghindari rintangan. Lanjutkan sampai Anda lelah dan kemudian beralih ke tab lain untuk mengakhiri permainan.
Di balik terpal: Ada tiga jenis rintangan CACTUS_SMALL
,, CACTUS_LARGE
dan PTERODACTYL
(mereka didefinisikan dalam larik s.types
). Ketika Anda menabrak rintangan, referensi jenis rintangan itu akan disimpan Runner.instance_.horizon.obstacles[0]
sehingga Anda mengubah jenis rintangan itu yPos
menjadi sesuatu yang besar. Hambatan jenis ini sekarang akan diposisikan di luar kanvas sehingga Anda tidak melihatnya dan yang lebih penting, tidak dapat mengenai mereka. Seperti yang saya katakan, saya tidak terlalu paham dengan javascript jadi saya tidak tahu cara mengedit s.types
langsung dari konsol (dalam hal ini Anda dapat mengubah yPos
ketiga jenis sekaligus) tetapi jika Anda bisa, silakan edit posting ini atau komentar di bawah.
Is Game Suspect = false
Tampaknya game tersebut masih bisa dimainkan secara otomatis melalui JavaScript.
Pertama, agar jelas, saya tidak membuat skrip ini secara keseluruhan. ( sumber asli ) Saya memodifikasinya agar unicorn mengelak dan menyesuaikan ketinggian lompatannya.
Itu secara konsisten memberi saya skor sekitar 1500 hingga 2000+ (sebelum unicorn tersandung secara tidak sengaja).
Saya tidak sengaja membuat diri saya diblokir (kemungkinan besar bukan karena penggunaan skrip di bawah) saat mencoba cara curang lainnya. Saya punya teori tentang mengapa saya dilarang, mungkin berkaitan dengan totalJumps
.
Inilah salah satu skor tertinggi saya yang saya dapatkan menggunakan skrip di bawah ini sebelum saya dilarang.
const autoPlayLoop = function() {
const JUMP_SPEED = 750;
const DISTANCE_BEFORE_JUMP = 112;
const instance = window.Runner.instance_;
const tRex = instance.tRex;
if (tRex.jumping) {
requestAnimationFrame(autoPlayLoop);
return;
}
const tRexPos = tRex.xPos;
const obstacles = instance.horizon.obstacles;
const nextObstacle = obstacles.find(o => o.xPos > tRexPos);
if (nextObstacle && (nextObstacle.xPos - tRexPos) <= DISTANCE_BEFORE_JUMP) {
if (nextObstacle.yPos < 80) {
tRex.setDuck(true);
} else {
tRex.startJump(JUMP_SPEED)
}
}
requestAnimationFrame(autoPlayLoop);
}
requestAnimationFrame(autoPlayLoop);
Sebagai gantinya di bagian atas papan peringkat adalah bagian Statistik Keseluruhan baru (dari 2020-12-22) (jika Anda dapat memikirkan nama yang lebih baik, beri tahu saya)
Saya berpikir bagaimana mereka menyebutnya di aula permainan, dan saya pikir
Skor Tertinggi Sepanjang Waktu
dan
Skor Tertinggi Harian
akan menyenangkan
Karena Panda sudah menyebutkannya, saya juga mencoba mengotomatiskan game menggunakan pendekatan berbeda yang diambil dari sini dan awalnya dimaksudkan untuk memainkan game lari T-Rex.
Kode ini bahkan lebih sederhana daripada yang diposting oleh Panda. Saya tidak tahu apakah ini yang membuat saya dilarang, tetapi ini adalah versi modifikasi yang saya gunakan untuk referensi.
(function loop() {
var rand = Math.round(Math.random() * (3)) + 3;
setTimeout(function() {
try{
DoAction()
}
catch(e){
}
loop();
}, rand);
}());
function DoAction(){
if (Runner.instance_.horizon.obstacles.length > 0){ // if obsticles exist
if (Runner.instance_.horizon.obstacles[0].xPos < Runner.instance_.currentSpeed * 20 - Runner.instance_.horizon.obstacles[0].width/3 && Runner.instance_.horizon.obstacles[0].yPos > 75){
keyUp(40);
keyDown(38);
}
else if (Runner.instance_.horizon.obstacles[0].xPos < Runner.instance_.currentSpeed * 20 - Runner.instance_.horizon.obstacles[0].width && Runner.instance_.horizon.obstacles[0].yPos > 75){
keyDown(40);
}
}
}
Perhatikan bahwa saya saat ini dilarang di game tersebut, jadi mungkin ada pemeriksaan akses langsung ke variabel game yang telah diterapkan setelah fase uji retas pertama, atau keteraturan lompatan memicu beberapa heuristik. Ini juga alasan saya mengubah kode sehingga loop sekarang memiliki penundaan acak yang seharusnya membuat lompatan tampak lebih "seperti manusia", tetapi saya tidak dapat menguji apakah itu cukup untuk menggagalkan pencegahan cheat di tempat. Sayangnya, saya tidak memikirkan hal itu sebelum mendapatkan larangan.
Berdasarkan apa yang dilaporkan tab jaringan, game tersebut tampaknya menjalankan tiga jenis permintaan:
- https://winterbash2020.stackexchange.com/hat-dash/start: hanya sinyal bahwa game telah dimulai. Termasuk cap waktu
- https://winterbash2020.stackexchange.com/hat-dash/cp: yang aneh. Pesan yang berisi durasi dan "lompatan total". Saat ini saya tidak mengerti KAPAN ini dipanggil, tetapi ini mungkin bagian dari sistem pencegahan cheat sisi klien. Namun, saya perhatikan ini dipanggil bahkan ketika bermain tanpa cheat , jadi saya tidak yakin.
- https://winterbash2020.stackexchange.com/hat-dash/end: dipanggil di akhir game, berisi info yang diharapkan seperti durasi dan semacamnya. Juga mereferensikan variabel "lompatan total" lagi. Anehnya, itu juga berisi daftar "kunci sejarah", seperti permainan yang entah bagaimana mereferensikan skor sebelumnya juga.
Awalnya saya berpikir bahwa "totaljump" tampaknya nilai yang paling mungkin untuk dikaitkan dengan pencegahan kecurangan, diikuti oleh susunan riwayat.
PEMBARUAN: Saya mulai ragu bahwa saya diblokir karena bot sejak awal. Saya berpikir itu pasti terkait dengan heuristik sisi server lain yang setidaknya secara teknis tidak ada hubungannya dengan kecurangan (dapat dipicu hanya dengan menguji hal-hal). Beberapa ide acak yang saya miliki:
- Saya mencoba bermain di jendela browser inprivate sehingga saya akan keluar untuk melakukan beberapa pengujian tanpa benar-benar mengirimkan skor apa pun .... Mungkin memiliki klien dengan hasil IP yang sama baik yang tidak tercatat maupun yang masuk adalah pemicu;
- Saya menggunakan dua versi Firefox, standar dan pengembang. Karena penasaran, saya juga menggunakan pengembang untuk memainkan game dalam "mode seluler" untuk melihat apakah fitur yang dilaporkan seseorang (segitiga rendah menghilang) benar dan membandingkan perilakunya dengan game Chrome T-Rex. Beberapa pengguna dilaporkan dilarang karena "terlalu banyak mengalihkan string agen pengguna"
- Karena api tampaknya melacak riwayat skor pemain, mungkin api juga mencoba melakukan beberapa alasan berdasarkan "keterampilan" - jika seseorang tiba-tiba mendapat skor yang tampaknya tidak sesuai dengan keterampilan mereka, itu bisa menjadi pemicu. Tampaknya cukup aneh - jika itu masalahnya, saya akan berasumsi banyak skor di luar dunia akan menghasilkan larangan instan (btw, mengingat bahwa game tersebut mungkin menjadi tidak dapat dimainkan oleh manusia sekitar ... maks 20k karena perubahan kecepatan , mengapa ini bukan apa-apa? Saya ragu manusia bisa mencapai 100k).
Yang mengatakan, ini hanya tes untuk melihat apakah logikanya masih cukup mirip dengan menjalankan T-Rex asli bahwa cheat yang dimaksudkan untuk game asli akan berjalan di versi Hat-Dash juga (sesuatu yang sudah dicoba dan didemonstrasikan seseorang di versi lama. pos). Saya tidak punya banyak waktu luang sekarang, jadi saya akan melaporkannya lagi nanti jika saya menemukan lebih banyak info yang perlu diperhatikan.
PS: seandainya seseorang bertanya-tanya apa yang harus dilakukan baris ini ...
if (Runner.instance_.horizon.obstacles[0].xPos < Runner.instance_.currentSpeed * 20 - Runner.instance_.horizon.obstacles[0].width && Runner.instance_.horizon.obstacles[0].yPos > 75){
keyDown(40);
}
Itu adalah upaya yang sangat primitif untuk memecahkan masalah dengan lompatan "mustahil" yang dimiliki game ini. Seperti yang Magish perhatikan, terkadang Unicorn tidak jatuh cukup cepat untuk bisa melompati rintangan yang terlalu dekat dengan yang sebelumnya. Dalam kasus ini, menekan membantu dengan membuat Unicorn jatuh lebih cepat.
Akhir-akhir ini saya telah melakukan banyak pekerjaan dengan perpustakaan otomatisasi peramban Playwright , dan ketika yang Anda miliki hanyalah palu ... Saya tidak mengatakan ini cara yang baik untuk menipu — bukan — tapi saya penasaran apakah Saya bisa melakukannya tanpa mengotak-atik permainan itu sendiri sama sekali.
Ide awal saya adalah menggunakan Playwright untuk memuat halaman dan memulai permainan dan kemudian berulang kali menangkap tangkapan layar untuk dianalisis. Ini berarti saya tidak perlu menyentuh apa pun di dalam lingkungan browser selain menekan spasi, untuk stealth maksimum. Ini berfungsi, tetapi ternyata meminta Chromium untuk mengambil tangkapan layar (yang menyebabkan perubahan ukuran seluruh halaman), memuatnya ke buffer, dan kemudian memprosesnya mengambil urutan 150 md, yang terlalu lambat untuk mencapai bahkan satu skor terhormat menggunakan logika yang sangat sederhana yang ada dalam pikiran saya. Aku curang, sangat buruk.
Jadi saya beralih meminta browser klien untuk mengaktifkan elemen toDataURL()
game <canvas>
dan mendapatkan data gambar kembali seperti itu. Ini bisa mencapai latensi pada urutan 10-15ms. Saya berulang kali menangkap gambar permainan dan melihat persegi panjang deteksi kecil untuk rintangan (piksel non-putih; computer vision, ini bukan). Jika saya menemukannya, saya menekan spasi. Ini tidak terlalu pintar (saya tidak mencoba menggunakan panah bawah, dan pada kecepatan tinggi itu bisa gagal karena mencoba melompat saat kita masih di udara), tetapi permainannya otomatis, jadi kita bisa terus bermain sampai kita cukup beruntung.
Proses ini dikendalikan oleh dua konstanta. Ada XCROP
, yang menentukan wilayah deteksi: seberapa jauh harus melihat ke depan saat mendeteksi rintangan. Menyetelnya salah berarti kita melompat terlalu dini atau terlambat. Dan ada SPEED_FACTOR
, yang meningkatkan xcrop secara linier saat permainan berlangsung untuk menyesuaikan kecepatan yang lebih cepat (apakah kecepatan meningkat secara linier? Saya tidak memeriksa). Konstanta ini sangat sensitif terhadap lingkungan tempat skrip dijalankan — tidak ada upaya yang dilakukan untuk menyinkronkan otomatisasi dengan game, dan SCALE_FACTOR
sepenuhnya bergantung pada berapa lama proses pengambilan gambar / loop untuk dijalankan; bahkan menambahkan / menghapus console.log()
pernyataan dalam pengujian sudah cukup untuk membuangnya. Jadi nilai-nilai ini mungkin tidak akan berfungsi di sistem Anda. Tetapi jika disetel dengan baik (yang dapat diotomatiskan dengan memainkan banyak game dengan nilai berbeda), itu dapat dengan mudah mencapai skor yang cukup baik untuk papan peringkat harian.
Ini tidak secara khusus mencoba untuk menghindari deteksi — ini melakukan spam pada spasi berulang kali pada kecepatan manusia super ketika sebuah objek terdeteksi dan memiliki ketahanan manusia super untuk bermain game demi game — dan logika pendeteksian dengan melihat persegi panjang selebar 33px untuk non-kulit putih piksel hampir tidak pintar, tetapi sepertinya selalu mencetak "Apakah Game Suspect = false."
const Jimp = require('jimp');
const {chromium} = require('playwright');
(async () => {
const XCROP = 122
const SPEED_FACTOR = 0.008
const browser = await chromium.launch({
headless: false
})
const context = await browser.newContext()
const page = await context.newPage()
// pipe the browser console to our console so we can see the "Is Game Suspect" message
page.on('console', msg => console.log(msg.text()))
const playGame = async (xcrop, speedFactor) => {
await page.goto('https://winterbash2020.stackexchange.com/run-with-the-hats')
const container = await page.waitForSelector('.runner-container')
// start the game
await container.click()
await container.press(' ')
await page.waitForTimeout(500)
const canvas = await page.$('canvas') let weLost = false for (let count=0; !weLost; count++) { // check if we lost and return our score if we did if (await page.$('.js-personal-stats > div')) {
weLost = true
const scoreElems = await page.$$('.js-personal-stats strong')
const score = parseInt(await scoreElems[2].innerText())
return score
}
// ask the game's <canvas> for its image data as a data url and stuff it in a buffer
const dataURL = await page.evaluate((elem) => {
return elem.toDataURL()
}, canvas)
const buffer = Buffer.from(dataURL.substr(22), 'base64')
// parse the image data and crop out a small rectangle from it with 1-bit color depth for analysis
const img = await Jimp.read(buffer)
let foundPixel = false
img
.crop(xcrop + (speedFactor * count), 100, 33, 20)
.posterize(2)
// look though the image data for any non-white pixels, which indicates we found an object
// the image is in RGBA format, so we can skip bits
for (let i = img.bitmap.data.length - 1; i >= 0; i -= 4) {
if (img.bitmap.data[i] != 0) {
foundPixel = true
break
}
}
// if we detected an object, press space to jump
if (foundPixel) {
await container.press(' ')
console.log(xcrop + (speedFactor * count), speedFactor, speedFactor * count)
}
}
}
const playMultipleGames = async (tries, ...args) => {
const results = []
for (let i=0; i<tries; i++) {
const score = await playGame.apply(null, args)
results.push(score)
}
console.log(results, args)
}
console.log(await playMultipleGames(20, XCROP, SPEED_FACTOR))
await page.close()
await context.close()
await browser.close()
})().catch((ex) => {
console.error(ex);
process.exit(1)
});
Saya melakukan sebagian besar pengujian saya keluar, tetapi menambahkan langkah masuk ke skrip untuk beberapa tes akhir (setelah beberapa saat, saya mulai memicu captcha pada formulir masuk, jadi itu berfungsi setidaknya). Anda bisa mencekal saya sekarang.
Saya merevisi skrip putar otomatis dari jawaban Panda , mengganti banyak detail implementasi, menggunakan beberapa rumus dari jawaban SPArcheon (penghitungan jarak lompatan), dan memasukkan beberapa kode curang yang diambil dari jawaban Tuqay (mengatur ulang kotak tabrakan rintangan). Saya juga mencoba untuk memotong kecepatan game untuk menghindari beberapa deteksi cheat sisi klien dan sebenarnya itu berjalan dengan baik.
Saya mematikan Resource Override kali ini - jadi tidak ada file SE yang dimanipulasi. Vanilla Google Chrome tanpa ekstensi apa pun sudah cukup.
Saya sudah mengirimkan dua skor dari sockpuppet (akun utama saya diblokir) dan masih belum diblokir, lihat tangkapan layar di bawah. Namun, skor teratas belum muncul di papan peringkat.
PS Saya merekomendasikan Microsoft Visual Studio Code untuk mengedit dan men-debug JavaScript yang berjalan di Google Chrome atau Microsoft Edge (berbasis Chromium baru).
const keySpace = {
key: " ",
keyCode: 32,
code: "Space",
which: 32,
shiftKey: false,
ctrlKey: false,
metaKey: false,
isDown: false,
},
keyDown = {
key: "down",
keyCode: 40,
code: "Down",
which: 40,
shiftKey: false,
ctrlKey: false,
metaKey: false,
isDown: false,
};
const createKeyEvent = function (keyObj, duration) {
if (!keyObj.isDown) {
document.dispatchEvent(new KeyboardEvent("keydown", keyObj));
keyObj.isDown = true;
}
setTimeout(() => {
if (keyObj.isDown) {
document.dispatchEvent(new KeyboardEvent("keyup", keyObj));
keyObj.isDown = false;
}
}, duration)
;
};
const autoPlayLoop = function () {
const instance = Runner.instance_;
const speed = instance.currentSpeed;
if (speed > instance.config.MAX_SPEED) {
instance.currentSpeed = instance.config.MAX_SPEED - 0.1;
}
const tRex = instance.tRex;
// if (tRex.jumping) {
// requestAnimationFrame(autoPlayLoop);
// return;
// }
const tRexPos = tRex.xPos;
const obstacles = instance.horizon.obstacles;
const prevObstacle = obstacles.find((o) => o.xPos <= tRexPos);
const nextObstacle = obstacles.find((o) => o.xPos > tRexPos);
if (tRex.jumping) {
if (prevObstacle) {
createKeyEvent(keyDown, 200);
}
} else if (nextObstacle) {
nextObstacle.collisionBoxes = [];
const DISTANCE_BEFORE_JUMP = 20 * speed - nextObstacle.width / 3;
if (nextObstacle.xPos - tRexPos <= DISTANCE_BEFORE_JUMP) {
if (nextObstacle.yPos < 80) {
// dodge instead of jump
createKeyEvent(keyDown, 300);
} else {
if (speed >= 18) {
createKeyEvent(keySpace, 30);
//setTimeout(() => createKeyEvent(keyDown, 300), 150);
} else {
createKeyEvent(keySpace, 30);
}
//tRex.startJump(JUMP_SPEED);
}
}
}
requestAnimationFrame(autoPlayLoop);
};
requestAnimationFrame(autoPlayLoop);
Berikut solusi bagi mereka yang terlalu malas menekan Spasi untuk memulai permainan dan mencoba peretasan lainnya (saya):
(async () => {
var score = 4000;
var seconds = 200;
var jumps = 400;
Runner.gameStarted();
Runner.setCurrentScore(score);
await new Promise(resolve => setTimeout(resolve, seconds * 1000));
Runner.gameEnded(Runner.instance_.startedAt, jumps);
})();
Ganti score
, seconds
dan jumps
sesuai. Akan sangat membantu untuk melihat skor sah orang lain di papan peringkat .
Diadaptasi dari jawaban saya sebelumnya . Ditambahkan jumpCount
, karena itu juga dikirim ke server dengan fitur anti-curang baru.
Sistem larangan otomatis yang diperbarui memeriksa nilai ilegal untuk gravitasi, kecepatan jatuh, kecepatan lompatan awal, kecepatan saat ini, dan jumlah hambatan. Karena saya tidak memodifikasi nilai-nilai itu, saya hanya perlu khawatir tentang kecepatan saat ini karena seiring berjalannya permainan, kecepatan saat ini meningkat. Untuk menghindari tersandung sistem larangan otomatis, saya hanya menggeser kotak tabrakan ke atas pada sumbu y setiap kali kecepatan saat ini kurang dari 25. Ini adalah kode yang saya gunakan:
setInterval(function() {
var yPosition = 1000;
function shiftCollisionBoxes(obstacles, yPosition) {
if (obstacles && yPosition >= 0) {
for (var i = 0; i < obstacles.length; i++){
for (var j = 0; j < obstacles[i].collisionBoxes.length; j++){
obstacles[i].collisionBoxes[j].y = yPosition;
}
}
}
}
if (Runner.instance_.currentSpeed < 25) {
shiftCollisionBoxes(Runner.instance_.horizon.obstacles, yPosition);
shiftCollisionBoxes(Runner.instance_.obstacles, yPosition);
}
},200);
Saya berjanji untuk menjadi baik . Saya kira saya lupa menyebutkan kapan. Saya mengakui bahwa solusi ini tidak 100% unik karena solusi lain sudah dikacaukan dengan kotak tabrakan dan pemosisian sumbu y. Namun, solusi ini menunjukkan bahwa memeriksa keberadaan kotak tabrakan saja tidak cukup. Kode juga harus memeriksa bahwa posisi kotak tabrakan tidak dirusak. Solusi ini juga secara eksplisit menghindari pemanggilan sistem larangan otomatis yang diperbarui. Jika saya berhasil masuk ke dalam hall of fame, topi ini akan cocok dengan van putih saya. Selamat liburan semuanya!
Saya dapat mengubah skor dengan mengedit Number
fungsi. Ketika diganti, kode tersebut mencoba untuk mengubah string skor menjadi angka pada baris 1168 dari kode Firefox yang cukup dicetak dan menjalankan fungsi kustom sebagai gantinya. Tempel kode ini ke konsol JavaScript:
function Number(n) {
return 1000000;
}