Bagaimana cara memprediksi gerakan dengan benar ketika seorang pemain tidak terlihat?

20

Saya memiliki permainan multipemain dan saya melakukan prediksi sisi klien, tetapi beberapa pemain bisa minum ramuan dan menjadi tidak terlihat ...

Masalahnya adalah ketika mereka menjadi tidak terlihat, saya tidak membagikan apa pun yang bisa digunakan klien untuk mengetahui dia ada di sana, jadi ketika seorang pemain mencoba masuk ke ubin yang ditempati oleh pemain yang tidak terlihat, dia memperkirakan bahwa dia berhasil, dan kemudian mendapat koreksi posisi jelek yang dikirim oleh server.

Salah satu solusinya adalah membagikan sesuatu sehingga klien dapat mengetahuinya, tetapi kemudian peretas dapat menggunakannya untuk mencari tahu di mana pemain yang tidak terlihat, curang.

Tapi saya sudah memecahkan prediksi pergerakan reguler, ini bekerja dengan sempurna.

pernyataan
sumber
4
Cukup kirim info tentang semua pemain. Curang akan menipu. Jangan melumpuhkan pengalaman pemain jujur ​​dan berpikir tentang menciptakan sistem penandaan untuk curang.
user1306322
2
@ user1306322 Dengan mempermudah pemain curang, Anda juga akan melumpuhkan pemain yang jujur. Sistem penandaan adalah ide yang bagus, tetapi jika tembus pandang adalah bagian besar dari permainan, sesuatu yang preventif mungkin perlu.
ThatOneGuy
@ user1895420 biasanya cukup baik untuk tidak mengirim hal-hal seperti itu dalam teks biasa, sehingga tidak ada pemain rata-rata dapat dengan mudah mendapatkan data itu. Jika hanya orang yang paham teknologi yang dapat melakukannya, maka tindakan pencegahannya sama baiknya dengan yang lain.
user1306322
1
Atau, mungkin, itu adalah ide yang lebih baik untuk sedikit mengubah mekanika tembus pandang sehingga tidak bekerja dalam jarak yang sangat dekat, sehingga bahkan mereka yang mampu menipu jalan mereka melalui data game tidak bisa benar-benar mendapatkan keuntungan.
user1306322
Bagaimana kalau hanya mengirim posisi pemain yang tidak terlihat (dengan bendera untuk membuatnya tidak terlihat) hanya ketika pemain yang terlihat dekat? Itu akan memberi Anda beberapa bingkai untuk menghindari masalah over-movement, sementara itu seharusnya tidak memberi cukup waktu bagi cheater untuk bereaksi. Untuk dua pemain yang tidak terlihat, saya hanya akan mengabaikan tabrakan. Jika Anda memiliki server pusat yang memiliki semua posisi pemain, Anda juga bisa mengoordinasikan kapan akan menyiarkan posisi dan kapan tidak.
jdm

Jawaban:

30

Ini dapat dianggap sebagai masalah animasi. Jika koreksi posisi kembali dari server karena upaya untuk pindah ke objek yang tidak terlihat, kirim kembali tidak hanya koreksi tetapi juga sebuah bendera yang menunjukkan mengapa koreksi itu diperlukan. Alih-alih pemain muncul mundur, dia mungkin melakukan animasi mundur "woah", membuatnya lebih bisa dipercaya terlihat seperti dia baru saja mengalami sesuatu.

Dalam game yang menggunakan pendekatan ini, tidak jarang menghilangkan tembus pandang (setidaknya untuk sementara) dari apa pun yang terjadi. Di antara hal-hal lain ini memberikan insentif bagi pemain yang tidak terlihat untuk menghindari keramaian atau terlalu dekat dengan karakter lain, mengurangi frekuensi terjadinya tabrakan dengan pemain yang tidak terlihat. Jadi, bahkan jika animasi Anda untuk jenis tabrakan ini lemah (atau tidak ada), itu agak disembunyikan oleh karakter yang tak terlihat muncul ke visibilitas dan jelas telegraphing kepada semua orang apa yang baru saja terjadi.

Kebutuhan animasi dapat dihapus dengan tidak membiarkan pekerjaan tembus pandang dari jarak dekat. Ini bahkan memberikan lebih banyak insentif kepada pemain yang tidak terlihat untuk menghindari mendekati karakter lain. Ini adalah pendekatan umum untuk game berbasis siluman dan AI (ganti "tidak terlihat" dengan "tidak terlihat sesuai target") dan dapat dilihat di game PvP seperti World of Tanks. Tidak perlu khawatir tentang respons tabrakan dengan karakter yang tidak terlihat jika Anda tidak ada yang terlihat cukup dekat untuk Anda bertabrakan (dalam batas latensi).

Solusi Dracor untuk mengabaikan tabrakan dengan benda tak kasat mata juga bagus. Sekali lagi ini membutuhkan beberapa animasi (untuk klien pemain yang tidak terlihat) sehingga objek tidak hanya memotong melalui avatar pemain di layarnya. Jika tidak ada yang lain, Anda dapat menyebabkan objek yang terlihat selalu mendorong yang tidak terlihat sehingga pemain yang tidak terlihat dipindahkan secara otomatis dari server jika seseorang bertabrakan dengannya.

Tabrakan tak kasat mata agak sulit. Mungkin menguntungkan untuk hanya menonaktifkan tabrakan pada mereka karena tidak ada yang bisa melihat apakah dua objek tak terlihat saling berdekatan (dengan asumsi "tidak terlihat" kami maksudkan bahwa kedua objek tidak terlihat oleh klien yang sama). Jika salah satu objek menjadi terlihat secara otomatis kembali ke respon tabrakan terlihat-tidak terlihat (dorong objek tidak terlihat).

Ini semua menjadi lebih sulit jika tembus pandang memiliki set rumit siapa yang dapat melihat siapa. Solusi pertama atau kedua di atas kemungkinan terbaik di sini jika Anda membutuhkannya. Tidak setiap masalah seperti ini membutuhkan solusi teknis; banyak hanya membutuhkan solusi desain (mis., jangan izinkan fitur ini untuk desainer Anda).

Sean Middleditch
sumber
5
Permainan Team Fortress 2 menggunakan pendekatan pertama ... Jika mata-mata yang tidak terlihat menyentuh pemain lain, pemain lain dapat melihat mata-mata (atau jika dari belakang, setidaknya merasakan beberapa kendala).
Xantix
4

Saya benar-benar hanya melihat dua opsi di sini jika Anda tidak ingin memberi tahu klien di mana pemain yang tidak terlihat adalah: 1) Anda mengabaikan tabrakan unit untuk pemain yang tidak terlihat - solusi sederhana, dan pemain tidak akan dapat menemukan pemain yang tidak terlihat oleh tes tabrakan baik. 2) Setelah memutuskan jalur yang diprediksi, Anda mengirim server jalur yang diprediksi dan memperbaiki jalur itu sendiri di sisi server, lalu mengirim jalur yang baru kembali.

Daniel Rusznyak
sumber
masalah dengan mengabaikan tabrakan untuk pemain tak terlihat adalah jika pemain tak terlihat berhenti menjadi tidak terlihat saat bertabrakan dengan orang lain. Juga, rasanya tidak benar. Dalam permainan saya, saya tidak benar-benar memiliki jalur atau pathfinding, pemain hanya dapat bergerak di 4 arah, satu langkah pada satu waktu
affiszervmention
Kemudian yang tersisa adalah mengirim gerakan yang diprediksi (baik vektor tunggal atau array vektor) dan melakukan pemeriksaan sisi server. Atau hanya menghidupkan koreksi, seperti yang dikatakan di bawah.
Daniel Rusznyak
1
Jika Anda memiliki peta berbasis kotak dan memeriksa setiap kotak satu per satu, Anda juga dapat mencoba untuk menyandikan lokasi karakter yang tidak terlihat di sisi server dengan pengkodean satu arah, seperti SHA-1 atau SHA-2 , lalu periksa jalur Anda sendiri dengan menyandikan koordinat yang dicentang dengan algoritma yang sama. Tidak dapat mengatakan ini efektif-kinerja, tetapi jika Anda benar-benar ingin melakukannya di sisi klien, solusi ini dapat bekerja dengan baik dengan sejumlah posisi terbatas, dan peretasan mungkin sangat merepotkan karena banyaknya titik grid yang harus dikodekan. dan cocok dengan data dalam memori.
Daniel Rusznyak
Saya bisa melihat itu bekerja. Peta terkecil saya memiliki 1500 posisi berbeda. Haruskah saya menggunakan HMAC dengan kunci yang berubah setiap beberapa detik untuk mencegah penyerang mengkomputasi semua posisi?
affiszervmention
5
Tidak, skema apa pun yang dapat Anda buat tidak akan "aman" terhadap peretas. Jika klien dapat menentukan apakah pemain akan bertabrakan dengan posisi yang diberikan, maka seseorang dapat meretas permainan Anda. HMAC dengan kunci yang berputar tidak akan mencegah klien melakukan 1500 HMACs per detik. Jangan tidak mencoba untuk melakukan kriptografi sendiri. Jika Anda ingin mencapai tujuan awal, hanya kirim posisi pemain yang tidak terlihat ke klien jika mereka berada dalam 1 atau 2 ubin pemain. Maka Anda hanya dapat meretas untuk mengetahui apakah seseorang tepat di sebelah Anda (yang tidak berguna karena Anda bisa pindah untuk memeriksanya).
2

Kecuali saya salah memahami sesuatu, solusinya sederhana. Jangan mengirim informasi klien pada semua pemain yang tidak terlihat, hanya mereka yang berada dalam jangkauan yang dapat mengalami benturan dalam batas gerak selama interval yang diprediksi. Dengan kata lain, jika klien hanya harus memprediksi 200 ms ke masa depan, hanya mengirim informasi tentang pemain tak terlihat dalam max_player_velocity units/sec * 1/5 secunit jauh.

R ..
sumber
Saya kira itu bisa berhasil, tetapi permainan saya berbasis ubin (lupa mengatakan).
affiszervmention
Jadi, hanya ungkapkan pemain yang tidak terlihat di ubin yang berdekatan, atau 2 langkah jauhnya, atau apa pun.
R ..
maka itu tidak yakin mereka akan bertabrakan, dan pemain tak terlihat harus menjauh dari siapa pun yang meretas agar tidak ditemukan
affiszervmention