السلام عليكم ورحمة الله وبركاته
أُقدم لكم اليوم موضوع بسيط عن حل ثغرة تحويل الوون الى يانغ بأسهل طريقة
شرح الثغرة: عند كتابتك رقم وون به فاصلة (مثل 1.9) ستحصل على 190,000,000 وسيأخذ منك 1 وون فقط، 900 مليون هدية.
سبق وأن قام الأخ Quest بنشر الحل ولكنه بدائي وتكويده سئ (مع كامل احترامي له)
هذا الحل سيعتمد وببساطة على دالة math.ceil
math.ceil هي دالة تقوم بتقريب اي رقم به فاصلة للرقم بعده
مثلا ان كتبت 1.9 سيتم احتسابها 2، واذا كتبت 2.4 سيتم احتسابها 3.
حل الثغرة تقوم باضافة هذا الكود للكويست:
local won = tonumber(input())
wonnew = math.ceil(won)
ثم تبديل won بwonnew في دالات التبديل وغيرها،
وهذا هو الكويست مضاف اليه الدالة:
quest cheque_trade begin
state start begin
when warehouse_keeper.chat." تبديل الوون " begin
local wonToYang = 100000000 -- 100kk
local s = select(" وون الي يانغ ", " يانغ الي وون ", " الغاء ")
if s == 1 then
say(" وون الي يانغ ")
say(" كم الكميه التي ترغب في استبدالها ؟ ")
say(" 1 وون = 100.000.000 يانغ ")
say(" اقل عدد 1 واعلي عدد 99 ")
local won = tonumber(input())
wonnew = math.ceil(won)
if wonnew < 1 or wonnew > 19 then
say(" تحقق من المعلومات ")
say(" اعلي قيمه للون : 99 ")
say(" اعلي قيمة لليانغ : 2.000.000.000 ")
return
end
local newMoney = wonToYang * wonnew
say(" وون الي يانغ ")
say(" هل ترغب بالفعل في تحويل "..wonnew.." وون الي "..newMoney)
local s2 = select(" تحويل "," الغاء ")
if s2 == 2 then return end
if pc.get_cheque() < wonnew then
say(" لا تملك ما يكفي من الوون ")
return
end
if pc.get_gold() + newMoney > 2000000000 then --2kkk
say(" لديك الكثير من اليانغ . لا يمكن اتمام العمليه ")
return
end
if wonnew > 1 or wonnew < 19 then
pc.change_cheque(-wonnew)
pc.change_gold(newMoney)
else
say(" الرقم المدخل غير صحيح ! ")
end
elseif s == 2 then
say(" يانغ الي وون ")
say(" كم الكميه التي ترغب في استبدالها ؟ ")
say(" 1 وون = 100.000.000 يانغ ")
say(" اقل عدد 1 واعلي عدد 99 ")
local won = tonumber(input())
if won < 1 or won > 19 then
say(" تحقق من المعلومات ")
say(" اعلي قيمه للون : 99 ")
say(" اعلي قيمة لليانغ : 2.000.000.000 ")
return
end
local newMoney = (wonToYang * won) + wonToYang * won * 3 / 100
say(" 3% ضريبه ")
say(" يانغ الي وون ")
say(" هل ترغب بالفعل في تحويل "..newMoney.." يانغ الي "..won.." وون ")
local s2 = select(" تحويل "," الغاء ")
if s2 == 2 then return end
if pc.get_gold() < newMoney then
say(" لا تملك ما يكفي من اليانغ ")
return
end
if pc.get_cheque() + won > 99 then --99 max won
say(" لديك الكثير من الوون . لا يمكن اتمام العمليه ")
return
end
if won > 1 or won < 19 then
pc.change_cheque(won)
pc.change_gold(-newMoney)
else
say(" الرقم المدخل غير صحيح ! ")
end
else return end
end
end
end
(أنا اخذت كويست المنشور من قبل الأخ Quest واضافة الدالة له واغلاق الثغرة ولا أعلم ان كان الكويست الاصلي يحتوي على مشاكل أم لا)
تحياتي، والسلام خير الختام.