finaltotransfer
Подготовка к переезду на другой сервер
This commit is contained in:
parent
1051e44893
commit
906fffd2ca
23
bot.js
23
bot.js
@ -72,7 +72,9 @@ const {
|
||||
shot,
|
||||
outmenu,
|
||||
lobbyCreate,
|
||||
lobbyMenu
|
||||
lobbyMenu,
|
||||
garage,
|
||||
race
|
||||
} = require('./commands')
|
||||
const {
|
||||
spaces,
|
||||
@ -104,7 +106,8 @@ const {
|
||||
const pocketsteal = require('./scenes/pocketsteal')
|
||||
const shop = require('./scenes/shop')
|
||||
const pve = require('./scenes/pve')
|
||||
const stage = new Scenes.Stage([crime, pocketsteal, shop, pve]);
|
||||
const newpve = require('./scenes/newpve')
|
||||
const stage = new Scenes.Stage([crime, pocketsteal, shop, pve, newpve]);
|
||||
|
||||
const start = async () => {
|
||||
try {
|
||||
@ -282,7 +285,8 @@ bot.command('start', async (ctx) => {
|
||||
})
|
||||
|
||||
bot.hears('Криминал', async (ctx) => {
|
||||
await ctx.scene.enter('Crime')
|
||||
await ctx.reply(`Closed`)
|
||||
/*await ctx.scene.enter('Crime')*/
|
||||
})
|
||||
|
||||
|
||||
@ -326,6 +330,10 @@ bot.hears('💳 Баланс', async (ctx) => {
|
||||
|
||||
bot.hears('🎁 Бонус', bonus)
|
||||
|
||||
bot.hears('Гараж', garage)
|
||||
|
||||
bot.hears('Гонка', race)
|
||||
|
||||
bot.command('pay', pay)
|
||||
|
||||
bot.hears('Мир', worldMenu)
|
||||
@ -435,10 +443,6 @@ bot.command('genpromo', genPromo)
|
||||
|
||||
///////////////////////////////////////Functions//////////////////////////////////////////////////////
|
||||
|
||||
setInterval(() => {
|
||||
generatePromo()
|
||||
}, 18000000);
|
||||
|
||||
setInterval(() => {
|
||||
var today = new Date();
|
||||
let hours = today.getHours();
|
||||
@ -446,7 +450,10 @@ setInterval(() => {
|
||||
weaponShopUpdate()
|
||||
matPriceUpdate()
|
||||
}
|
||||
}, 360000);
|
||||
/*if (hours == "9" || hours == "18" || hours == "12") {
|
||||
generatePromo()
|
||||
}*/
|
||||
}, 3600000);
|
||||
|
||||
start()
|
||||
|
||||
|
@ -13,7 +13,7 @@ module.exports = async (ctx) => {
|
||||
let user = await UserModel.findByPk(ctx.from.id)
|
||||
let property = await PropertyModel.findByPk(ctx.from.id)
|
||||
if(user.money < 500000) return ctx.telegram.answerCbQuery(ctx.callbackQuery.id, `Открытие контейнера стоит ₽500.000`, {show_alert: true})
|
||||
if(property.car.name) return ctx.telegram.answerCbQuery(ctx.callbackQuery.id, `У вас уже есть автомобиль\nПродайте текущий автомобиль: /sell car`, {show_alert: true})
|
||||
if(property.car1.name) return ctx.telegram.answerCbQuery(ctx.callbackQuery.id, `У вас уже есть автомобиль\nПродайте текущий автомобиль: /sell car`, {show_alert: true})
|
||||
user.money -= 500000
|
||||
let userWin = null
|
||||
switch(data){
|
||||
@ -24,7 +24,8 @@ module.exports = async (ctx) => {
|
||||
userWin = simplecars.random()
|
||||
break;
|
||||
}
|
||||
property.car = userWin
|
||||
property.car1 = userWin
|
||||
property.car1.health = 100
|
||||
user.save()
|
||||
property.save()
|
||||
ctx.deleteMessage()
|
||||
|
37
commands/garage.js
Normal file
37
commands/garage.js
Normal file
@ -0,0 +1,37 @@
|
||||
const {
|
||||
UserModel,
|
||||
PropertyModel,
|
||||
expToUp
|
||||
} = require('../config')
|
||||
const {
|
||||
spacesWithMarkdown,
|
||||
escape
|
||||
} = require('../utils')
|
||||
|
||||
module.exports = async (ctx) => {
|
||||
let user = await UserModel.findByPk(ctx.from.id);
|
||||
let property = await PropertyModel.findByPk(ctx.from.id);
|
||||
if (!user) return ctx.reply(`Ошибка #1`);
|
||||
return ctx.replyWithMarkdownV2(`
|
||||
👤${escape(user.username)} ${user.status == 'bronze' ? `\\[🔺\\]` : ""}${user.status == 'silver' ? `\\[🔹\\]` : ""}${user.status == 'gold' ? `\\[🔸\\]` : ""}${user.status == 'admin' ? "✅" : ""}
|
||||
🆔: ${ctx.from.id}
|
||||
|
||||
🚗 Гараж:
|
||||
Слот 1: ${property.car1 == 0 ? "Пусто" : escape(property.car1.name) + `
|
||||
Состояние: ${property.car1.health}%
|
||||
Стоимость: ${property.car1.price}
|
||||
Скорость: ${property.car1.speed}
|
||||
Ускорение: ${property.car1.acceleration}
|
||||
Управляемость: ${property.car1.control}
|
||||
`}
|
||||
Слот 2: ${property.car2 == 0 ? "Пусто" : escape(property.car2.name)}
|
||||
Слот 3: ${property.car3 == 0 ? "Пусто" : escape(property.car3.name)}
|
||||
Слот 4: ${property.car4 == 0 ? "Пусто" : escape(property.car4.name)}
|
||||
Слот 5: ${property.car5 == 0 ? "Пусто" : escape(property.car5.name)}
|
||||
`);
|
||||
}
|
||||
|
||||
/*
|
||||
🔫 Оружие: ${property.weapon == 0 ? "Безоружный" : escape(property.weapon.name)}
|
||||
🥼 Экипировка: ${property.equipment == 0 ? "Нет" : property.equipment.name}
|
||||
*/
|
@ -36,5 +36,7 @@ module.exports = {
|
||||
reportAnswer: require('./admin/reportAnswer'),
|
||||
fastblock: require('./admin/fastblock'),
|
||||
createPromo: require('./admin/createPromo'),
|
||||
genPromo: require('./admin/genPromo')
|
||||
genPromo: require('./admin/genPromo'),
|
||||
garage: require('./garage'),
|
||||
race: require('./race')
|
||||
}
|
@ -1,5 +1,6 @@
|
||||
const {
|
||||
Telegraf
|
||||
Telegraf,
|
||||
Markup
|
||||
} = require('telegraf')
|
||||
const bot = new Telegraf(process.env.BOT_TOKEN)
|
||||
const {
|
||||
|
@ -26,9 +26,13 @@ module.exports = async (ctx) => {
|
||||
|
||||
🔵 Имущество
|
||||
🏠 Жилье: ${property.house == 0 ? "Бездомный" : property.house.name}
|
||||
🚗 Автомобиль: ${property.car == 0 ? "Пешком" : escape(property.car.name)}
|
||||
🚗 Автомобиль: ${property.car1 == 0 ? "Пешком" : escape(property.car1.name)}
|
||||
📱 Телефон: ${property.mobile == 0 ? "Нет" : property.mobile.name}
|
||||
🔫 Оружие: ${property.weapon == 0 ? "Безоружный" : escape(property.weapon.name)}
|
||||
🥼 Экипировка: ${property.equipment == 0 ? "Нет" : property.equipment.name}
|
||||
|
||||
`);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
🔫 Оружие: ${property.weapon == 0 ? "Безоружный" : escape(property.weapon.name)}
|
||||
🥼 Экипировка: ${property.equipment == 0 ? "Нет" : property.equipment.name}
|
||||
*/
|
@ -88,7 +88,8 @@ module.exports = async (ctx) => {
|
||||
await user.save()
|
||||
await world.save()
|
||||
await property.save()
|
||||
return await ctx.reply(`Вы купили ${weaponshop[data.value].name}`)
|
||||
await ctx.reply(`Вы купили ${weaponshop[data.value].name}`)
|
||||
return delete weaponshop[data.value]
|
||||
}
|
||||
if (property.weapon.name) return await ctx.reply(`У вас уже есть оружие.`)
|
||||
user.money -= weaponshop[data.value].price
|
||||
@ -97,6 +98,7 @@ module.exports = async (ctx) => {
|
||||
await user.save()
|
||||
await world.save()
|
||||
await property.save()
|
||||
return await ctx.reply(`Вы купили ${weaponshop[data.value].name}`)
|
||||
await ctx.reply(`Вы купили ${weaponshop[data.value].name}`)
|
||||
return delete weaponshop[data.value]
|
||||
}
|
||||
}
|
@ -56,11 +56,11 @@ module.exports = async (ctx) => {
|
||||
return await ctx.reply(`Вы продали ${name}`)
|
||||
}
|
||||
if (ctx.args[1] == "car") {
|
||||
if (!property.car.name) return await ctx.reply(`У вас нет автомобиля.`)
|
||||
let name = property.car.name
|
||||
user.money += Math.round(property.car.price/2)
|
||||
world.balance -= Math.round(property.car.price/2)
|
||||
property.car = 0
|
||||
if (!property.car1.name) return await ctx.reply(`У вас нет автомобиля.`)
|
||||
let name = property.car1.name
|
||||
user.money += Math.round(property.car1.price/1.2)
|
||||
world.balance -= Math.round(property.car1.price/1.2)
|
||||
property.car1 = 0
|
||||
await user.save()
|
||||
await world.save()
|
||||
await property.save()
|
||||
|
86
commands/race.js
Normal file
86
commands/race.js
Normal file
@ -0,0 +1,86 @@
|
||||
const sequelize = require('/workspace/degradin/Dev/Telegram/CampFire Play/db');
|
||||
const {
|
||||
rarecars,
|
||||
simplecars,
|
||||
UserModel,
|
||||
PropertyModel
|
||||
} = require('/workspace/degradin/Dev/Telegram/CampFire Play/config')
|
||||
const {
|
||||
spaces,
|
||||
rand
|
||||
} = require('/workspace/degradin/Dev/Telegram/CampFire Play/utils')
|
||||
|
||||
module.exports = async (ctx) => {
|
||||
let user = await UserModel.findByPk(ctx.from.id)
|
||||
let property = await PropertyModel.findByPk(ctx.from.id)
|
||||
let userEnemy = rand(0,10)
|
||||
console.log(userEnemy)
|
||||
switch(userEnemy){
|
||||
case 4: case 5: case 6: case 7:
|
||||
userEnemy = rarecars.random()
|
||||
break;
|
||||
default:
|
||||
userEnemy = simplecars.random()
|
||||
break;
|
||||
}
|
||||
userEnemy.health = rand(10, 100)
|
||||
//ctx.deleteMessage()
|
||||
let enemyRate = (userEnemy.speed + userEnemy.acceleration + userEnemy.control) + userEnemy.health
|
||||
let userRate = (property.car1.speed + property.car1.acceleration + property.car1.control) + property.car1.health
|
||||
await ctx.sendPhoto(userEnemy.image, { caption: `
|
||||
Автомобиль противника:
|
||||
${userEnemy.name} | ${enemyRate}
|
||||
Состояние: ${userEnemy.health}%
|
||||
Скорость: ${userEnemy.speed}
|
||||
Ускорение: ${userEnemy.acceleration}
|
||||
Управляемость: ${userEnemy.control}
|
||||
|
||||
|
||||
Ваш автомобиль:
|
||||
${property.car1.name} | ${userRate}
|
||||
Состояние: ${property.car1.health}%
|
||||
Скорость: ${property.car1.speed}
|
||||
Ускорение: ${property.car1.acceleration}
|
||||
Управляемость: ${property.car1.control}
|
||||
`})
|
||||
|
||||
let winner = "Nobody"
|
||||
let winCheck = rand(0, 100)
|
||||
console.log(winCheck)
|
||||
if((userRate - enemyRate) > 10) {
|
||||
winner = user.username
|
||||
}else{
|
||||
if(winCheck >= 50){
|
||||
winner = userEnemy.name
|
||||
}else{
|
||||
winner = user.username
|
||||
}
|
||||
}
|
||||
|
||||
let carDamage = rand(1, 10)
|
||||
property.car1.health = 5
|
||||
const updateProperty = {
|
||||
car1: sequelize.fn('jsonb_set', 'car1', 'health', sequelize.literal(`car1->'health' - ${carDamage}`)),
|
||||
};
|
||||
|
||||
await property.update(updateProperty);
|
||||
property.save()
|
||||
return ctx.reply(`
|
||||
🏁 Результаты заезда:
|
||||
${userEnemy.name}
|
||||
______🚗___________________
|
||||
|
||||
${user.username}
|
||||
🚗_________________________
|
||||
|
||||
📣 Победитель ${winner}
|
||||
Выигрыш: 50.000🔶
|
||||
|
||||
💬 Отчет:
|
||||
${userEnemy.name}
|
||||
Состояние: -${carDamage}%
|
||||
|
||||
${property.car1.name}
|
||||
Состояние: -8%
|
||||
`)
|
||||
}
|
@ -14,15 +14,15 @@ module.exports = async (ctx) => {
|
||||
group: ['name', 'status'],
|
||||
where: {
|
||||
telegram_id: {
|
||||
[Op.ne]: 275416286
|
||||
[Op.notIn]: [275416286, 6489664401]
|
||||
}
|
||||
},
|
||||
order: [
|
||||
[sequelize.literal('money'), 'DESC']
|
||||
],
|
||||
limit: 10
|
||||
limit: 15
|
||||
})
|
||||
let text = `🏆 Топ 10 игроков по балансу.\n\n`
|
||||
let text = `🏆 Топ 15 игроков по балансу.\n\n`
|
||||
for(i=0; i<topPlayer.length; i++){
|
||||
text += `${topSym[i]}. ${topPlayer[i].status == 'bronze' ? `[🔺]` : ""}${topPlayer[i].status == 'silver' ? `[🔹]` : ""}${topPlayer[i].status == 'gold' ? `[🔸]` : ""} ${topPlayer[i].name} [₽${spaces(topPlayer[i].money)}]\n`
|
||||
}
|
||||
|
@ -20,6 +20,7 @@ module.exports = {
|
||||
LobbyModel: require('../models/lobby.model'),
|
||||
mainChat : -1001895132127,
|
||||
adminList : [275416286],
|
||||
promoTopicId: 1807,
|
||||
expToUp : [0, 10, 20, 40, 60, 100, 250, 370, 450, 575, 666, 777, 860, 999, 1000, 1177, 1234, 1350, 1488, 1515, 1610],
|
||||
topSym : ['🥇', '🥈', '🥉', '4️⃣', '5️⃣', '6️⃣', '7️⃣', '8️⃣', '9️⃣', '🔟'],
|
||||
topSym : ['🥇', '🥈', '🥉', '4️⃣', '5️⃣', '6️⃣', '7️⃣', '8️⃣', '9️⃣', '🔟', '🌫️', '🌫️', '🌫️', '🌫️', '🌫️'],
|
||||
}
|
@ -2,101 +2,56 @@
|
||||
{
|
||||
"name": "BMW 7 Series 2001",
|
||||
"price": 1100000,
|
||||
"speed": 47,
|
||||
"max_speed": 65,
|
||||
"acceleration": 40,
|
||||
"max_acceleration": 57,
|
||||
"control": 34,
|
||||
"max_control": 53,
|
||||
"image": "https://sun9-1.userapi.com/impg/d5DVc5oNorJw50mw0c1y_4iMA1gmFJQ9bqZ7IQ/uebjpdo7_dg.jpg?size=960x720&quality=96&sign=2e5cb705062b188c15050723a8598722&type=album"
|
||||
},
|
||||
{
|
||||
"name": "Mercedes W140 S600 1997",
|
||||
"price": 1300000,
|
||||
"speed": 48,
|
||||
"max_speed": 67,
|
||||
"acceleration": 42,
|
||||
"max_acceleration": 59,
|
||||
"control": 32,
|
||||
"max_control": 50,
|
||||
"image": "https://sun9-10.userapi.com/impg/_UawxXF4t14mD_6aHahzdibBK5TbATlnW_Yzmg/n38ggX23gFo.jpg?size=959x960&quality=96&sign=911a96d2f290a114f41806de26dd9351&type=album"
|
||||
},
|
||||
{
|
||||
"name": "Audi RS2 1994",
|
||||
"price": 3500000,
|
||||
"speed": 50,
|
||||
"max_speed": 71,
|
||||
"acceleration": 52,
|
||||
"max_acceleration": 69,
|
||||
"control": 34,
|
||||
"max_control": 62,
|
||||
"image": "https://sun9-37.userapi.com/impg/VnZ3YEAwLuLuF9OKhLdc8000uVH7oXuKt0RKWA/ucQP9J0Fo3A.jpg?size=1600x1200&quality=96&sign=fa9c200d9aedf424cbc9839949f5eeb0&type=album"
|
||||
},
|
||||
{
|
||||
"name": "Lotus Omega 1991",
|
||||
"price": 7000000,
|
||||
"speed": 50,
|
||||
"max_speed": 74,
|
||||
"acceleration": 49,
|
||||
"max_acceleration": 60,
|
||||
"control": 37,
|
||||
"max_control": 52,
|
||||
"image": "https://sun9-40.userapi.com/impg/z_XO05RQoDz1sexN4jNOOb0VG_lHX9HhyU1hGQ/nPz-SGAgWoQ.jpg?size=1280x800&quality=96&sign=96f0c7b5e7e035433cb19e7a81f664da&type=album"
|
||||
},
|
||||
{
|
||||
"name": "Acura RSX 2003",
|
||||
"price": 1000000,
|
||||
"speed": 45,
|
||||
"max_speed": 63,
|
||||
"acceleration": 43,
|
||||
"max_acceleration": 66,
|
||||
"control": 34,
|
||||
"max_control": 62,
|
||||
"image": "https://sun9-25.userapi.com/impg/bpq2RE5Olya6nuVmubYay4cH6Ju6akl6kdTaHw/_IAnNsU_HQw.jpg?size=1600x1200&quality=96&sign=e74da55a75a20d6ace2fc00059a975fb&type=album"
|
||||
},
|
||||
{
|
||||
"name": "Honda NSX 1991",
|
||||
"price": 6000000,
|
||||
"image": "https://sun9-78.userapi.com/impg/GocdnvUVxZP1QkkGcJBKI2pMzmitnBlS3uMHOA/BKE2BFk44NQ.jpg?size=1080x1080&quality=96&sign=84eb4a7eae688ab34242bf98c0b3b453&type=album"
|
||||
},
|
||||
{
|
||||
"name": "Mazda RX-7 FC 1990",
|
||||
"price": 2000000,
|
||||
"image": "https://sun9-16.userapi.com/impg/KSFDRrsRpHvePQdyFLMYPKJ8fO3r1HBFChItQQ/z3lILSdkoSQ.jpg?size=750x499&quality=96&sign=ce7cfe2238c8d2295f6d59c256a378a7&type=album"
|
||||
},
|
||||
{
|
||||
"name": "Corvette C3 1990",
|
||||
"price": 5000000,
|
||||
"image": "https://sun9-30.userapi.com/impg/S104d3tiupLZNxIag76AzoTD7eSP2c23SnEaFQ/9qGBEj--af4.jpg?size=1024x768&quality=96&sign=86a959a0b03668f412f5d158017e611c&type=album"
|
||||
},
|
||||
{
|
||||
"name": "Ford Mustang 302 boss 1970",
|
||||
"price": 5000000,
|
||||
"image": "https://sun9-33.userapi.com/impg/v5msKxJGvCm6_ku5HEVN0BntMV_5nti5VU_uUw/3_9wEI-wmr4.jpg?size=1600x1200&quality=96&sign=207c04e9ce19efd4ed896a1d33c07a8b&type=album"
|
||||
},
|
||||
{
|
||||
"name": "Dodge Viper SRT10 2010",
|
||||
"price": 7000000,
|
||||
"image": "https://static1.topspeedimages.com/wordpress/wp-content/uploads/jpg/200912/2010-dodge-viper-srt10-1.jpg"
|
||||
},
|
||||
{
|
||||
"name": "Alfa Romeo 4c 2015",
|
||||
"price": 10000000,
|
||||
"image": "https://sun9-66.userapi.com/impg/JhQb558Zh_1R7QGzpzMxnNcz5HL95QDPsLHrsA/vUb_j7G-g2M.jpg?size=1342x1920&quality=96&sign=3372c45b71a2aa9eb661cfaa0864875f&type=album"
|
||||
},
|
||||
{
|
||||
"name": "Alfa Romeo Gulia 2020",
|
||||
"price": 3500000,
|
||||
"image": "https://sun9-25.userapi.com/impg/H7d5BjKtcR9_dHqbIec87PHewxJdb76-HmBcdg/4ThAZlSR3vM.jpg?size=1920x1280&quality=96&sign=55afcf8e5e1aefb3943b992d0d5586f7&type=album"
|
||||
},
|
||||
{
|
||||
"name": "Lexus LFA 2012",
|
||||
"price": 24000000,
|
||||
"image": "https://sun9-59.userapi.com/impg/rs2uFK_yhce7n4LrUu6zRuEiMjmAZY1efF7rPw/M6KE-3yrCi0.jpg?size=960x1200&quality=96&sign=446b869ff12b7ec35eff551b01678cc4&type=album"
|
||||
},
|
||||
{
|
||||
"name": "Buick GNX 1987",
|
||||
"price": 7000000,
|
||||
"image": "https://sun9-80.userapi.com/impg/9UoGREtyWSCVLLGFzywnNX_-eDncb1B7Ax63DA/hb3J0XrlYZE.jpg?size=736x1102&quality=96&sign=06ccae23f18eb06b93ba3e46129f7138&type=album"
|
||||
},
|
||||
{
|
||||
"name": "Chevrolet Corvette Z06, 2006",
|
||||
"price": 4200000,
|
||||
"image": " https://w.forfun.com/fetch/9f/9f237b9f36e27d1fddf442020bd69ff4.jpeg"
|
||||
},
|
||||
{
|
||||
"name": "Porsche 911",
|
||||
"price": 7000000,
|
||||
"image": "https://ivanglazunov.ru/wp-content/uploads/5/3/6/53621ef51acb742df6a27295963e65d4.jpeg"
|
||||
},
|
||||
{
|
||||
"name": "Mercedes-Benz C 200",
|
||||
"price": 3500000,
|
||||
"image": "https://avtoshark.com/wp-content/uploads/2020/07/mersedes-c200.jpg"
|
||||
},
|
||||
{
|
||||
"name": "Audi Q5",
|
||||
"price": 4500000,
|
||||
"image": "https://avatars.mds.yandex.net/get-autoru-vos/5278263/8baf8d9c6f3fabbe19ab206a9b712713/1200x900n"
|
||||
},
|
||||
{
|
||||
"name": "Ferrari F8",
|
||||
"price": 34000000,
|
||||
"image": "https://avatars.mds.yandex.net/get-autoru-vos/2037331/cd075cbfc2d10c05bb0450dcc889d351/1200x900n"
|
||||
},
|
||||
{
|
||||
"name": "Mercedes-Benz AMG GT S, 2017",
|
||||
"price": 10500000,
|
||||
"image": "https://avatars.mds.yandex.net/get-autoru-vos/2159790/270111424b42001ae010abc3367bcda9/1200x900n"
|
||||
}
|
||||
]
|
102
json/rarecars.json.dis
Normal file
102
json/rarecars.json.dis
Normal file
@ -0,0 +1,102 @@
|
||||
[
|
||||
{
|
||||
"name": "BMW 7 Series 2001",
|
||||
"price": 1100000,
|
||||
"image": "https://sun9-1.userapi.com/impg/d5DVc5oNorJw50mw0c1y_4iMA1gmFJQ9bqZ7IQ/uebjpdo7_dg.jpg?size=960x720&quality=96&sign=2e5cb705062b188c15050723a8598722&type=album"
|
||||
},
|
||||
{
|
||||
"name": "Mercedes W140 S600 1997",
|
||||
"price": 1300000,
|
||||
"image": "https://sun9-10.userapi.com/impg/_UawxXF4t14mD_6aHahzdibBK5TbATlnW_Yzmg/n38ggX23gFo.jpg?size=959x960&quality=96&sign=911a96d2f290a114f41806de26dd9351&type=album"
|
||||
},
|
||||
{
|
||||
"name": "Audi RS2 1994",
|
||||
"price": 3500000,
|
||||
"image": "https://sun9-37.userapi.com/impg/VnZ3YEAwLuLuF9OKhLdc8000uVH7oXuKt0RKWA/ucQP9J0Fo3A.jpg?size=1600x1200&quality=96&sign=fa9c200d9aedf424cbc9839949f5eeb0&type=album"
|
||||
},
|
||||
{
|
||||
"name": "Lotus Omega 1991",
|
||||
"price": 7000000,
|
||||
"image": "https://sun9-40.userapi.com/impg/z_XO05RQoDz1sexN4jNOOb0VG_lHX9HhyU1hGQ/nPz-SGAgWoQ.jpg?size=1280x800&quality=96&sign=96f0c7b5e7e035433cb19e7a81f664da&type=album"
|
||||
},
|
||||
{
|
||||
"name": "Acura RSX 2003",
|
||||
"price": 1000000,
|
||||
"image": "https://sun9-25.userapi.com/impg/bpq2RE5Olya6nuVmubYay4cH6Ju6akl6kdTaHw/_IAnNsU_HQw.jpg?size=1600x1200&quality=96&sign=e74da55a75a20d6ace2fc00059a975fb&type=album"
|
||||
},
|
||||
{
|
||||
"name": "Honda NSX 1991",
|
||||
"price": 6000000,
|
||||
"image": "https://sun9-78.userapi.com/impg/GocdnvUVxZP1QkkGcJBKI2pMzmitnBlS3uMHOA/BKE2BFk44NQ.jpg?size=1080x1080&quality=96&sign=84eb4a7eae688ab34242bf98c0b3b453&type=album"
|
||||
},
|
||||
{
|
||||
"name": "Mazda RX-7 FC 1990",
|
||||
"price": 2000000,
|
||||
"image": "https://sun9-16.userapi.com/impg/KSFDRrsRpHvePQdyFLMYPKJ8fO3r1HBFChItQQ/z3lILSdkoSQ.jpg?size=750x499&quality=96&sign=ce7cfe2238c8d2295f6d59c256a378a7&type=album"
|
||||
},
|
||||
{
|
||||
"name": "Corvette C3 1990",
|
||||
"price": 5000000,
|
||||
"image": "https://sun9-30.userapi.com/impg/S104d3tiupLZNxIag76AzoTD7eSP2c23SnEaFQ/9qGBEj--af4.jpg?size=1024x768&quality=96&sign=86a959a0b03668f412f5d158017e611c&type=album"
|
||||
},
|
||||
{
|
||||
"name": "Ford Mustang 302 boss 1970",
|
||||
"price": 5000000,
|
||||
"image": "https://sun9-33.userapi.com/impg/v5msKxJGvCm6_ku5HEVN0BntMV_5nti5VU_uUw/3_9wEI-wmr4.jpg?size=1600x1200&quality=96&sign=207c04e9ce19efd4ed896a1d33c07a8b&type=album"
|
||||
},
|
||||
{
|
||||
"name": "Dodge Viper SRT10 2010",
|
||||
"price": 7000000,
|
||||
"image": "https://static1.topspeedimages.com/wordpress/wp-content/uploads/jpg/200912/2010-dodge-viper-srt10-1.jpg"
|
||||
},
|
||||
{
|
||||
"name": "Alfa Romeo 4c 2015",
|
||||
"price": 10000000,
|
||||
"image": "https://sun9-66.userapi.com/impg/JhQb558Zh_1R7QGzpzMxnNcz5HL95QDPsLHrsA/vUb_j7G-g2M.jpg?size=1342x1920&quality=96&sign=3372c45b71a2aa9eb661cfaa0864875f&type=album"
|
||||
},
|
||||
{
|
||||
"name": "Alfa Romeo Gulia 2020",
|
||||
"price": 3500000,
|
||||
"image": "https://sun9-25.userapi.com/impg/H7d5BjKtcR9_dHqbIec87PHewxJdb76-HmBcdg/4ThAZlSR3vM.jpg?size=1920x1280&quality=96&sign=55afcf8e5e1aefb3943b992d0d5586f7&type=album"
|
||||
},
|
||||
{
|
||||
"name": "Lexus LFA 2012",
|
||||
"price": 24000000,
|
||||
"image": "https://sun9-59.userapi.com/impg/rs2uFK_yhce7n4LrUu6zRuEiMjmAZY1efF7rPw/M6KE-3yrCi0.jpg?size=960x1200&quality=96&sign=446b869ff12b7ec35eff551b01678cc4&type=album"
|
||||
},
|
||||
{
|
||||
"name": "Buick GNX 1987",
|
||||
"price": 7000000,
|
||||
"image": "https://sun9-80.userapi.com/impg/9UoGREtyWSCVLLGFzywnNX_-eDncb1B7Ax63DA/hb3J0XrlYZE.jpg?size=736x1102&quality=96&sign=06ccae23f18eb06b93ba3e46129f7138&type=album"
|
||||
},
|
||||
{
|
||||
"name": "Chevrolet Corvette Z06, 2006",
|
||||
"price": 4200000,
|
||||
"image": " https://w.forfun.com/fetch/9f/9f237b9f36e27d1fddf442020bd69ff4.jpeg"
|
||||
},
|
||||
{
|
||||
"name": "Porsche 911",
|
||||
"price": 7000000,
|
||||
"image": "https://ivanglazunov.ru/wp-content/uploads/5/3/6/53621ef51acb742df6a27295963e65d4.jpeg"
|
||||
},
|
||||
{
|
||||
"name": "Mercedes-Benz C 200",
|
||||
"price": 3500000,
|
||||
"image": "https://avtoshark.com/wp-content/uploads/2020/07/mersedes-c200.jpg"
|
||||
},
|
||||
{
|
||||
"name": "Audi Q5",
|
||||
"price": 4500000,
|
||||
"image": "https://avatars.mds.yandex.net/get-autoru-vos/5278263/8baf8d9c6f3fabbe19ab206a9b712713/1200x900n"
|
||||
},
|
||||
{
|
||||
"name": "Ferrari F8",
|
||||
"price": 34000000,
|
||||
"image": "https://avatars.mds.yandex.net/get-autoru-vos/2037331/cd075cbfc2d10c05bb0450dcc889d351/1200x900n"
|
||||
},
|
||||
{
|
||||
"name": "Mercedes-Benz AMG GT S, 2017",
|
||||
"price": 10500000,
|
||||
"image": "https://avatars.mds.yandex.net/get-autoru-vos/2159790/270111424b42001ae010abc3367bcda9/1200x900n"
|
||||
}
|
||||
]
|
@ -2,61 +2,45 @@
|
||||
{
|
||||
"name": "Subaru Legacy II",
|
||||
"price": 267000,
|
||||
"speed": 25,
|
||||
"max_speed": 37,
|
||||
"acceleration": 20,
|
||||
"max_acceleration": 32,
|
||||
"control": 22,
|
||||
"max_control": 35,
|
||||
"image": "https://avatars.mds.yandex.net/get-verba/1540742/2a00000185547e7c4fe6a1ef0a2cccdcc91d/cattouchret"
|
||||
},
|
||||
{
|
||||
"name": "Peugeot 206",
|
||||
"price": 290000,
|
||||
"speed": 18,
|
||||
"max_speed": 30,
|
||||
"acceleration": 15,
|
||||
"max_acceleration": 27,
|
||||
"control": 25,
|
||||
"max_control": 38,
|
||||
"image": "https://avatars.mds.yandex.net/get-verba/1030388/2a000001609d64c298bd8a1807bbd401efe8/cattouchret"
|
||||
},
|
||||
{
|
||||
"name": "Ford Focus II",
|
||||
"price": 350000,
|
||||
"speed": 20,
|
||||
"max_speed": 32,
|
||||
"acceleration": 19,
|
||||
"max_acceleration": 29,
|
||||
"control": 21,
|
||||
"max_control": 36,
|
||||
"image": "https://avatars.mds.yandex.net/get-verba/1030388/2a000001609579d292099d1496c4184c3a1a/cattouchret"
|
||||
},
|
||||
{
|
||||
"name": "Chevrolet Lanos",
|
||||
"price": 250000,
|
||||
"image": "https://avatars.mds.yandex.net/get-verba/216201/2a000001609b62fdc53e55145a10f2ec6ecc/cattouchret"
|
||||
},
|
||||
{
|
||||
"name": "Opel Astra H",
|
||||
"price": 450000,
|
||||
"image": "https://avatars.mds.yandex.net/get-verba/216201/2a000001609cedee6fbec659b57da48df99a/cattouchret"
|
||||
},
|
||||
{
|
||||
"name": "Mitsubishi Lancer IX",
|
||||
"price": 380000,
|
||||
"image": "https://avatars.mds.yandex.net/get-verba/216201/2a0000016099a4e6be992d7b50134fd908fd/thumb_m_2x"
|
||||
},
|
||||
{
|
||||
"name": "Mitsubishi Lancer X",
|
||||
"price": 680000,
|
||||
"speed": 40,
|
||||
"max_speed": 54,
|
||||
"acceleration": 35,
|
||||
"max_acceleration": 42,
|
||||
"control": 34,
|
||||
"max_control": 43,
|
||||
"image": "https://avatars.mds.yandex.net/get-verba/216201/2a000001609bda17487cc63d8b957ab4aab2/cattouchret"
|
||||
},
|
||||
{
|
||||
"name": "Cadillac STS I",
|
||||
"price": 420000,
|
||||
"image": "https://avatars.mds.yandex.net/get-verba/787013/2a000001609c8f446bce6bfd7271b1c276aa/cattouchret"
|
||||
},
|
||||
{
|
||||
"name": "Toyota Mark II VIII (X100)",
|
||||
"price": 380000,
|
||||
"image": "https://avatars.mds.yandex.net/get-verba/787013/2a000001609d5a2d4aef665d95347c1aea99/cattouchret"
|
||||
},
|
||||
{
|
||||
"name": "Renault Logan",
|
||||
"price": 400000,
|
||||
"image": "https://cartechnic.ru/800/renault/logan/renault_logan_2013_1.jpg"
|
||||
},
|
||||
{
|
||||
"name": "Mazda 3",
|
||||
"price": 500000,
|
||||
"image": "https://a.d-cd.net/da371e4s-1920.jpg"
|
||||
},
|
||||
{
|
||||
"name": "Hot Wheels Lamborghini Sian FKP 37 Orange Коллекционная",
|
||||
"price": 1000,
|
||||
"image": "https://ir.ozone.ru/s3/multimedia-4/wc700/6769855444.jpg"
|
||||
}
|
||||
]
|
62
json/simplecars.json.dis
Normal file
62
json/simplecars.json.dis
Normal file
@ -0,0 +1,62 @@
|
||||
[
|
||||
{
|
||||
"name": "Subaru Legacy II",
|
||||
"price": 267000,
|
||||
"image": "https://avatars.mds.yandex.net/get-verba/1540742/2a00000185547e7c4fe6a1ef0a2cccdcc91d/cattouchret"
|
||||
},
|
||||
{
|
||||
"name": "Peugeot 206",
|
||||
"price": 290000,
|
||||
"image": "https://avatars.mds.yandex.net/get-verba/1030388/2a000001609d64c298bd8a1807bbd401efe8/cattouchret"
|
||||
},
|
||||
{
|
||||
"name": "Ford Focus II",
|
||||
"price": 350000,
|
||||
"image": "https://avatars.mds.yandex.net/get-verba/1030388/2a000001609579d292099d1496c4184c3a1a/cattouchret"
|
||||
},
|
||||
{
|
||||
"name": "Chevrolet Lanos",
|
||||
"price": 250000,
|
||||
"image": "https://avatars.mds.yandex.net/get-verba/216201/2a000001609b62fdc53e55145a10f2ec6ecc/cattouchret"
|
||||
},
|
||||
{
|
||||
"name": "Opel Astra H",
|
||||
"price": 450000,
|
||||
"image": "https://avatars.mds.yandex.net/get-verba/216201/2a000001609cedee6fbec659b57da48df99a/cattouchret"
|
||||
},
|
||||
{
|
||||
"name": "Mitsubishi Lancer IX",
|
||||
"price": 380000,
|
||||
"image": "https://avatars.mds.yandex.net/get-verba/216201/2a0000016099a4e6be992d7b50134fd908fd/thumb_m_2x"
|
||||
},
|
||||
{
|
||||
"name": "Mitsubishi Lancer X",
|
||||
"price": 680000,
|
||||
"image": "https://avatars.mds.yandex.net/get-verba/216201/2a000001609bda17487cc63d8b957ab4aab2/cattouchret"
|
||||
},
|
||||
{
|
||||
"name": "Cadillac STS I",
|
||||
"price": 420000,
|
||||
"image": "https://avatars.mds.yandex.net/get-verba/787013/2a000001609c8f446bce6bfd7271b1c276aa/cattouchret"
|
||||
},
|
||||
{
|
||||
"name": "Toyota Mark II VIII (X100)",
|
||||
"price": 380000,
|
||||
"image": "https://avatars.mds.yandex.net/get-verba/787013/2a000001609d5a2d4aef665d95347c1aea99/cattouchret"
|
||||
},
|
||||
{
|
||||
"name": "Renault Logan",
|
||||
"price": 400000,
|
||||
"image": "https://cartechnic.ru/800/renault/logan/renault_logan_2013_1.jpg"
|
||||
},
|
||||
{
|
||||
"name": "Mazda 3",
|
||||
"price": 500000,
|
||||
"image": "https://a.d-cd.net/da371e4s-1920.jpg"
|
||||
},
|
||||
{
|
||||
"name": "Hot Wheels Lamborghini Sian FKP 37 Orange Коллекционная",
|
||||
"price": 1000,
|
||||
"image": "https://ir.ozone.ru/s3/multimedia-4/wc700/6769855444.jpg"
|
||||
}
|
||||
]
|
@ -1,57 +1,57 @@
|
||||
{
|
||||
"0": {
|
||||
"name": "G36C",
|
||||
"price": 38999,
|
||||
"damage": 0.035,
|
||||
"type": "weapon"
|
||||
},
|
||||
"1": {
|
||||
"name": "M1911",
|
||||
"price": 13000,
|
||||
"damage": 0.018,
|
||||
"type": "weapon"
|
||||
},
|
||||
"1": {
|
||||
"name": "ПМ",
|
||||
"price": 13000,
|
||||
"damage": 0.01,
|
||||
"type": "weapon"
|
||||
},
|
||||
"2": {
|
||||
"name": "АК101",
|
||||
"price": 49999,
|
||||
"damage": 0.04,
|
||||
"name": "HK UMP",
|
||||
"price": 33999,
|
||||
"damage": 0.028,
|
||||
"type": "weapon"
|
||||
},
|
||||
"3": {
|
||||
"name": "ТТ",
|
||||
"price": 12000,
|
||||
"damage": 0.15,
|
||||
"type": "weapon"
|
||||
},
|
||||
"4": {
|
||||
"name": "ПП19 `Бизон`",
|
||||
"price": 24999,
|
||||
"damage": 0.023,
|
||||
"type": "weapon"
|
||||
},
|
||||
"4": {
|
||||
"name": "Glock 17",
|
||||
"price": 7999,
|
||||
"damage": 0.013,
|
||||
"type": "weapon"
|
||||
},
|
||||
"5": {
|
||||
"name": "Бронежилет M2",
|
||||
"price": 1000,
|
||||
"name": "Картонные накладки",
|
||||
"price": 350,
|
||||
"type": "equipment"
|
||||
},
|
||||
"6": {
|
||||
"name": "Бронежилет M6",
|
||||
"price": 1000,
|
||||
"name": "Бронежилет M5",
|
||||
"price": 150000,
|
||||
"type": "equipment"
|
||||
},
|
||||
"7": {
|
||||
"name": "Картонные накладки",
|
||||
"price": 1000,
|
||||
"name": "Бронежилет M1",
|
||||
"price": 25000,
|
||||
"type": "equipment"
|
||||
},
|
||||
"8": {
|
||||
"name": "Бронежилет M2",
|
||||
"price": 1000,
|
||||
"name": "Бронежилет M3",
|
||||
"price": 60000,
|
||||
"type": "equipment"
|
||||
},
|
||||
"9": {
|
||||
"name": "Бронежилет M5",
|
||||
"price": 1000,
|
||||
"name": "Бронежилет M1",
|
||||
"price": 25000,
|
||||
"type": "equipment"
|
||||
}
|
||||
}
|
BIN
media/image.png
BIN
media/image.png
Binary file not shown.
Before Width: | Height: | Size: 116 KiB After Width: | Height: | Size: 117 KiB |
@ -4,7 +4,11 @@ const {DataTypes} = require('sequelize');
|
||||
const Property = sequelize.define('property', {
|
||||
telegram_id: {type: DataTypes.STRING, primaryKey: true, unique: true},
|
||||
house: {type: DataTypes.JSON, defaultValue: 0},
|
||||
car: {type: DataTypes.JSON, defaultValue: 0},
|
||||
car1: {type: DataTypes.JSON, defaultValue: 0},
|
||||
car2: {type: DataTypes.JSON, defaultValue: 0},
|
||||
car3: {type: DataTypes.JSON, defaultValue: 0},
|
||||
car4: {type: DataTypes.JSON, defaultValue: 0},
|
||||
car5: {type: DataTypes.JSON, defaultValue: 0},
|
||||
mobile: {type: DataTypes.JSON, defaultValue: 0},
|
||||
weapon: {type: DataTypes.JSON, defaultValue: 0},
|
||||
equipment: {type: DataTypes.JSON, defaultValue: 0}
|
||||
|
2518
package-lock.json
generated
2518
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@ -17,7 +17,7 @@
|
||||
"error-stack-parser": "^2.1.4",
|
||||
"fs": "^0.0.1-security",
|
||||
"node-telegram-bot-api": "^0.52.0",
|
||||
"nodemon": "^2.0.7",
|
||||
"nodemon": "^3.0.1",
|
||||
"pg": "^8.6.0",
|
||||
"pg-hstore": "^2.3.3",
|
||||
"pm2": "^5.3.0",
|
||||
|
3
run.ps1
3
run.ps1
@ -1,2 +1,3 @@
|
||||
[System.Console]::Title = 'CampFireGame'
|
||||
nodemon --ignore json/ .\index.js
|
||||
nodemon --ignore json/ .\index.js
|
||||
pause
|
249
scenes/newpve.js
Normal file
249
scenes/newpve.js
Normal file
@ -0,0 +1,249 @@
|
||||
const {
|
||||
Telegraf,
|
||||
Scenes,
|
||||
Markup
|
||||
} = require('telegraf')
|
||||
const bot = new Telegraf(process.env.BOT_TOKEN)
|
||||
const {
|
||||
slots,
|
||||
phones,
|
||||
UserModel,
|
||||
WorldModel,
|
||||
SkillsModel,
|
||||
PropertyModel
|
||||
} = require('/workspace/degradin/Dev/Telegram/CampFire Play/config')
|
||||
const {
|
||||
spaces,
|
||||
getSlot,
|
||||
giveExp,
|
||||
rand,
|
||||
random,
|
||||
setCooldown,
|
||||
drop
|
||||
} = require('/workspace/degradin/Dev/Telegram/CampFire Play/utils');
|
||||
const newpve = new Scenes.BaseScene('NEWPVE');
|
||||
const resultTier = [
|
||||
{hit: 'Head', droprate: 10},
|
||||
{hit: 'Chest', droprate: 14},
|
||||
{hit: 'Stom', droprate: 16},
|
||||
{hit: 'Arms', droprate: 18},
|
||||
{hit: 'Legs', droprate: 20},
|
||||
{hit: 'Miss', droprate: 22}
|
||||
]
|
||||
|
||||
newpve.enter(async (ctx) => {
|
||||
let property = await PropertyModel.findByPk(ctx.from.id)
|
||||
let mainMessage = await ctx.reply(`Ваш противник:\n${ctx.session.enemy.name}\nЗдоровье: ${ctx.session.enemy.hp}\nБроня: ${ctx.session.enemy.armor}`, Markup.inlineKeyboard([
|
||||
[{text: '👮', callback_data: `HIT_HEAD`}],
|
||||
[{text: '💪', callback_data: `HIT_ARM`},{text: '👕', callback_data: `HIT_CHEST`},{text: '💪', callback_data: `HIT_ARM`}],
|
||||
[{text: '👖', callback_data: `HIT_STOM`}],
|
||||
[{text: '🦵', callback_data: `HIT_LEG`},{text: '🦵', callback_data: `HIT_LEG`}],
|
||||
]));
|
||||
ctx.session.mainMessage = mainMessage
|
||||
ctx.session.battlelog = `\nBattle Log:\n`
|
||||
});
|
||||
|
||||
newpve.on('callback_query', async (ctx, next) => {
|
||||
ctx.session.stage = `SHOP_KILL_CASHIER`
|
||||
setTimeout(() => {
|
||||
if(ctx.session.enemy.hp <= 0){
|
||||
switch(ctx.session.stage){
|
||||
case 'SHOP_KILL_CASHIER': case 'SHOP_GUARD_KILL': case 'SHOP_GUARD_STEALTH':
|
||||
ctx.session.__scenes = { current: 'SHOP_ROBBERY', state: {} }
|
||||
return ctx.sendMessage('Охранник обезврежен, вы подходите к кассиру:', Markup.inlineKeyboard([
|
||||
[{text: 'Убить кассира и забрать все из кассы', callback_data: `SHOP_KILL_CASHIER`}],
|
||||
//[{text: 'Приказать кассиру сдать кассу [Угроза]', callback_data: `SHOP_THREAT`}],
|
||||
//[{text: 'Приказать кассиру сдать кассу [Убеждение]', callback_data: `SHOP_CONVICTION`}]
|
||||
]))
|
||||
case 'SHOP_CASH_SMASH':
|
||||
ctx.session.__scenes = { current: 'SHOP_ROBBERY', state: {} }
|
||||
return ctx.sendMessage('Вы завершили перестрелку с полицией, пора валить.', Markup.inlineKeyboard([
|
||||
[{text: 'Завершить ограбление', callback_data: `SHOP_END`}]
|
||||
]))
|
||||
default:
|
||||
return ctx.sendMessage('Ошибка выхода из сцены => DEBUG', Markup.inlineKeyboard([
|
||||
[{text: 'Завершить ограбление [Магазин]', callback_data: `SHOP_END`}]
|
||||
]))
|
||||
}
|
||||
}
|
||||
}, 500);
|
||||
|
||||
return next().then(() => {
|
||||
})
|
||||
})
|
||||
|
||||
newpve.action('HIT_HEAD', async (ctx) => {
|
||||
let result = drop(resultTier)
|
||||
let msg = ctx.session.mainMessage
|
||||
if(rand(1,100) >= 25){
|
||||
ctx.session.battlelog += `\nВы промахиваетесь!\n${ctx.session.enemy.name} наносит вам 10 урона.`
|
||||
}else{
|
||||
let enemyHP = ctx.session.enemy.hp
|
||||
let property = await PropertyModel.findByPk(ctx.from.id)
|
||||
enemyHP = enemyHP - (property.weapon.damage*1000)*10
|
||||
ctx.session.enemy.hp = enemyHP
|
||||
ctx.session.battlelog += `\nВы попадаете в голову: ${(property.weapon.damage*1000)*10} урона.`
|
||||
}
|
||||
await bot.telegram.editMessageText(
|
||||
msg.chat.id, // ID чата
|
||||
msg.message_id, // ID сообщения, которое вы хотите изменить
|
||||
undefined, // Inline-клавиатуру оставьте неопределенной, чтобы она не изменилась
|
||||
`Ваш противник:\n${ctx.session.enemy.name}\nЗдоровье: ${ctx.session.enemy.hp}\nБроня: ${ctx.session.enemy.armor}` + ctx.session.battlelog, Markup.inlineKeyboard([
|
||||
[{text: '👮', callback_data: `HIT_HEAD`}],
|
||||
[{text: '💪', callback_data: `HIT_ARM`},{text: '👕', callback_data: `HIT_CHEST`},{text: '💪', callback_data: `HIT_ARM`}],
|
||||
[{text: '👖', callback_data: `HIT_STOM`}],
|
||||
[{text: '🦵', callback_data: `HIT_LEG`},{text: '🦵', callback_data: `HIT_LEG`}],
|
||||
])
|
||||
)
|
||||
})
|
||||
|
||||
newpve.action('HIT_CHEST', async (ctx) => {
|
||||
let result = drop(resultTier)
|
||||
let msg = ctx.session.mainMessage
|
||||
if(rand(1,100) >= 50){
|
||||
ctx.session.battlelog += `\nВы промахиваетесь!\n${ctx.session.enemy.name} наносит вам 10 урона.`
|
||||
}else{
|
||||
let enemyHP = ctx.session.enemy.hp
|
||||
let enemyArmor = ctx.session.enemy.armor
|
||||
let property = await PropertyModel.findByPk(ctx.from.id)
|
||||
if(enemyArmor > 0){
|
||||
enemyArmor = enemyArmor - (property.weapon.damage*1000)*5
|
||||
if(enemyArmor < 0) enemyHP = enemyHP + enemyArmor
|
||||
ctx.session.battlelog += `\nВы попадаете в бронежилет: ${(property.weapon.damage*1000)*5} урона.`
|
||||
}else{
|
||||
enemyHP = enemyHP - (property.weapon.damage*1000)*5
|
||||
ctx.session.battlelog += `\nВы попадаете в грудь: ${(property.weapon.damage*1000)*5} урона.`
|
||||
}
|
||||
ctx.session.enemy.armor = enemyArmor
|
||||
ctx.session.enemy.hp = enemyHP
|
||||
}
|
||||
await bot.telegram.editMessageText(
|
||||
msg.chat.id, // ID чата
|
||||
msg.message_id, // ID сообщения, которое вы хотите изменить
|
||||
undefined, // Inline-клавиатуру оставьте неопределенной, чтобы она не изменилась
|
||||
`Ваш противник:\n${ctx.session.enemy.name}\nЗдоровье: ${ctx.session.enemy.hp}\nБроня: ${ctx.session.enemy.armor}` + ctx.session.battlelog, Markup.inlineKeyboard([
|
||||
[{text: '👮', callback_data: `HIT_HEAD`}],
|
||||
[{text: '💪', callback_data: `HIT_ARM`},{text: '👕', callback_data: `HIT_CHEST`},{text: '💪', callback_data: `HIT_ARM`}],
|
||||
[{text: '👖', callback_data: `HIT_STOM`}],
|
||||
[{text: '🦵', callback_data: `HIT_LEG`},{text: '🦵', callback_data: `HIT_LEG`}],
|
||||
])
|
||||
)
|
||||
})
|
||||
|
||||
newpve.action('HIT_LEG', async (ctx) => {
|
||||
let result = drop(resultTier)
|
||||
let msg = ctx.session.mainMessage
|
||||
if(rand(1,100) >= 70){
|
||||
ctx.session.battlelog += `\nВы промахиваетесь!\n${ctx.session.enemy.name} наносит вам 10 урона.`
|
||||
}else{
|
||||
let enemyHP = ctx.session.enemy.hp
|
||||
let property = await PropertyModel.findByPk(ctx.from.id)
|
||||
enemyHP = enemyHP - (property.weapon.damage*1000)/1.5
|
||||
ctx.session.enemy.hp = enemyHP
|
||||
ctx.session.battlelog += `\nВы попадаете в ногу: ${(property.weapon.damage*1000)/1.5} урона.`
|
||||
}
|
||||
await bot.telegram.editMessageText(
|
||||
msg.chat.id, // ID чата
|
||||
msg.message_id, // ID сообщения, которое вы хотите изменить
|
||||
undefined, // Inline-клавиатуру оставьте неопределенной, чтобы она не изменилась
|
||||
`Ваш противник:\n${ctx.session.enemy.name}\nЗдоровье: ${ctx.session.enemy.hp}\nБроня: ${ctx.session.enemy.armor}` + ctx.session.battlelog, Markup.inlineKeyboard([
|
||||
[{text: '👮', callback_data: `HIT_HEAD`}],
|
||||
[{text: '💪', callback_data: `HIT_ARM`},{text: '👕', callback_data: `HIT_CHEST`},{text: '💪', callback_data: `HIT_ARM`}],
|
||||
[{text: '👖', callback_data: `HIT_STOM`}],
|
||||
[{text: '🦵', callback_data: `HIT_LEG`},{text: '🦵', callback_data: `HIT_LEG`}],
|
||||
])
|
||||
)
|
||||
|
||||
})
|
||||
|
||||
newpve.action('attack', async (ctx) => {
|
||||
let enemyHP = ctx.session.enemy.hp
|
||||
let enemyArmor = ctx.session.enemy.armor
|
||||
let property = await PropertyModel.findByPk(ctx.from.id)
|
||||
|
||||
let result = drop(resultTier)
|
||||
console.log(result)
|
||||
switch(result.hit){
|
||||
case 'Head':
|
||||
enemyHP = enemyHP - (property.weapon.damage*1000)*10
|
||||
ctx.reply(`Enemy Head: HP:${enemyHP} Armor: ${enemyArmor}`)
|
||||
break;
|
||||
case 'Chest':
|
||||
if(enemyArmor > 0){
|
||||
enemyArmor = enemyArmor - (property.weapon.damage*1000)*5
|
||||
if(enemyArmor < 0) enemyHP = enemyHP + enemyArmor
|
||||
ctx.reply(`Enemy Chest: HP:${enemyHP} Armor: ${enemyArmor}`)
|
||||
}else{
|
||||
enemyHP = enemyHP - (property.weapon.damage*1000)*5
|
||||
ctx.reply(`Enemy Chest: HP:${enemyHP} Armor: ${enemyArmor}`)
|
||||
}
|
||||
break;
|
||||
case 'Stom':
|
||||
if(enemyArmor > 0){
|
||||
enemyArmor = enemyArmor - (property.weapon.damage*1000)*3
|
||||
if(enemyArmor < 0) enemyHP = enemyHP + enemyArmor
|
||||
ctx.reply(`Enemy Stom: HP:${enemyHP} Armor: ${enemyArmor}`)
|
||||
}else{
|
||||
enemyHP = enemyHP - (property.weapon.damage*1000)*3
|
||||
ctx.reply(`Enemy Stom: HP:${enemyHP} Armor: ${enemyArmor}`)
|
||||
}
|
||||
break;
|
||||
case 'Arms':
|
||||
enemyHP = enemyHP - (property.weapon.damage*1000)/2
|
||||
ctx.reply(`Enemy Arms: HP:${enemyHP} Armor: ${enemyArmor}`)
|
||||
break;
|
||||
case 'Legs':
|
||||
enemyHP = enemyHP - (property.weapon.damage*1000)/1.5
|
||||
ctx.reply(`Enemy Legs: HP:${enemyHP} Armor: ${enemyArmor}`)
|
||||
break;
|
||||
case 'Miss':
|
||||
ctx.reply(`Промах, лох`)
|
||||
break;
|
||||
}
|
||||
ctx.session.enemy.hp = enemyHP
|
||||
ctx.session.enemy.armor = enemyArmor
|
||||
if (enemyHP <= 0) {
|
||||
console.log(ctx.session)
|
||||
switch(ctx.session.stage){
|
||||
case 'SHOP_KILL_CASHIER': case 'SHOP_GUARD_KILL': case 'SHOP_GUARD_STEALTH':
|
||||
ctx.session.__scenes = { current: 'SHOP_ROBBERY', state: {} }
|
||||
return ctx.sendMessage('Охранник обезврежен, вы подходите к кассиру:', Markup.inlineKeyboard([
|
||||
[{text: 'Убить кассира и забрать все из кассы', callback_data: `SHOP_KILL_CASHIER`}],
|
||||
//[{text: 'Приказать кассиру сдать кассу [Угроза]', callback_data: `SHOP_THREAT`}],
|
||||
//[{text: 'Приказать кассиру сдать кассу [Убеждение]', callback_data: `SHOP_CONVICTION`}]
|
||||
]))
|
||||
case 'SHOP_CASH_SMASH':
|
||||
ctx.session.__scenes = { current: 'SHOP_ROBBERY', state: {} }
|
||||
return ctx.sendMessage('Вы завершили перестрелку с полицией, пора валить.', Markup.inlineKeyboard([
|
||||
[{text: 'Завершить ограбление', callback_data: `SHOP_END`}]
|
||||
]))
|
||||
default:
|
||||
return ctx.sendMessage('Ошибка выхода из сцены => DEBUG', Markup.inlineKeyboard([
|
||||
[{text: 'Завершить ограбление [Магазин]', callback_data: `SHOP_END`}]
|
||||
]))
|
||||
}
|
||||
} else {
|
||||
// Противник еще жив, отправляем сообщение с обновленным HP и кнопкой для атаки
|
||||
let enemyDmg = rand(0, 10)
|
||||
ctx.session.user.hp -= enemyDmg
|
||||
if(ctx.session.user.hp <= 0) {
|
||||
ctx.editMessageText(`${ctx.session.enemy.name} наносит вам ${enemyDmg} урона.\n Осталось HP: ${ctx.session.user.hp}\nВы критически ранены!`, Markup.inlineKeyboard([
|
||||
[
|
||||
{text: 'Завершить ограбление', callback_data: `SHOP_END`}
|
||||
]
|
||||
]))
|
||||
}
|
||||
ctx.sendMessage(`${ctx.session.enemy.name} наносит вам ${enemyDmg} урона.\n Осталось HP: ${ctx.session.user.hp}`)
|
||||
ctx.editMessageText(`Ваш противник:\n${ctx.session.enemy.name}\nЗдоровье: ${ctx.session.enemy.hp}\nБроня: ${ctx.session.enemy.armor}`, Markup.inlineKeyboard([
|
||||
[
|
||||
{text: `${property.weapon.name}`, callback_data: `attack`}
|
||||
]
|
||||
]));
|
||||
}
|
||||
});
|
||||
|
||||
newpve.leave((ctx) => {
|
||||
console.log('Завершено');
|
||||
});
|
||||
|
||||
module.exports = newpve
|
@ -124,7 +124,8 @@ steal.action(`POCKET_BAG`, async (ctx) => {
|
||||
let values = 0
|
||||
|
||||
for(i=1; i<=times; i++){
|
||||
switch(i) {
|
||||
randomize = rand(1,100)
|
||||
switch(randomize) {
|
||||
case 2:
|
||||
values = rand(10000, 50000)
|
||||
moneyIn += values
|
||||
|
@ -18,7 +18,8 @@ getSlot,
|
||||
giveExp,
|
||||
rand,
|
||||
random,
|
||||
setCooldown
|
||||
setCooldown,
|
||||
drop
|
||||
} = require('/workspace/degradin/Dev/Telegram/CampFire Play/utils');
|
||||
const pve = new Scenes.BaseScene('PVE');
|
||||
|
||||
@ -35,58 +36,51 @@ pve.action('attack', async (ctx) => {
|
||||
let enemyHP = ctx.session.enemy.hp
|
||||
let enemyArmor = ctx.session.enemy.armor
|
||||
let property = await PropertyModel.findByPk(ctx.from.id)
|
||||
let result = await ctx.replyWithDice({emoji: `🎯`})
|
||||
switch(result.dice.value){
|
||||
case 6:
|
||||
let resultTier = [
|
||||
{hit: 'Head', droprate: 10},
|
||||
{hit: 'Chest', droprate: 20},
|
||||
{hit: 'Stom', droprate: 25},
|
||||
{hit: 'Arms', droprate: 40},
|
||||
{hit: 'Legs', droprate: 55},
|
||||
{hit: 'Miss', droprate: 50}
|
||||
]
|
||||
let result = drop(resultTier)
|
||||
console.log(result)
|
||||
switch(result.hit){
|
||||
case 'Head':
|
||||
enemyHP = enemyHP - (property.weapon.damage*1000)*10
|
||||
setTimeout(() => {
|
||||
ctx.reply(`Enemy Head: HP:${enemyHP} Armor: ${enemyArmor}`)
|
||||
}, 1900)
|
||||
break;
|
||||
case 5:
|
||||
case 'Chest':
|
||||
if(enemyArmor > 0){
|
||||
enemyArmor = enemyArmor - (property.weapon.damage*1000)*5
|
||||
if(enemyArmor < 0) enemyHP = enemyHP + enemyArmor
|
||||
setTimeout(() => {
|
||||
ctx.reply(`Enemy Chest: HP:${enemyHP} Armor: ${enemyArmor}`)
|
||||
}, 1900)
|
||||
}else{
|
||||
enemyHP = enemyHP - (property.weapon.damage*1000)*5
|
||||
setTimeout(() => {
|
||||
ctx.reply(`Enemy Chest: HP:${enemyHP} Armor: ${enemyArmor}`)
|
||||
}, 1900)
|
||||
}
|
||||
break;
|
||||
case 4:
|
||||
case 'Stom':
|
||||
if(enemyArmor > 0){
|
||||
enemyArmor = enemyArmor - (property.weapon.damage*1000)*3
|
||||
if(enemyArmor < 0) enemyHP = enemyHP + enemyArmor
|
||||
setTimeout(() => {
|
||||
ctx.reply(`Enemy Stom: HP:${enemyHP} Armor: ${enemyArmor}`)
|
||||
}, 1900)
|
||||
}else{
|
||||
enemyHP = enemyHP - (property.weapon.damage*1000)*3
|
||||
setTimeout(() => {
|
||||
ctx.reply(`Enemy Stom: HP:${enemyHP} Armor: ${enemyArmor}`)
|
||||
}, 1900)
|
||||
}
|
||||
break;
|
||||
case 3:
|
||||
case 'Arms':
|
||||
enemyHP = enemyHP - (property.weapon.damage*1000)/2
|
||||
setTimeout(() => {
|
||||
ctx.reply(`Enemy Arms: HP:${enemyHP} Armor: ${enemyArmor}`)
|
||||
}, 1900)
|
||||
break;
|
||||
case 2:
|
||||
case 'Legs':
|
||||
enemyHP = enemyHP - (property.weapon.damage*1000)/1.5
|
||||
setTimeout(() => {
|
||||
ctx.reply(`Enemy Legs: HP:${enemyHP} Armor: ${enemyArmor}`)
|
||||
}, 1900)
|
||||
break;
|
||||
case 1:
|
||||
setTimeout(() => {
|
||||
case 'Miss':
|
||||
ctx.reply(`Промах, лох`)
|
||||
}, 1900)
|
||||
break;
|
||||
}
|
||||
ctx.session.enemy.hp = enemyHP
|
||||
|
@ -41,9 +41,10 @@ shop.enter(async (ctx) => {
|
||||
[
|
||||
{text: 'SOLO', callback_data: `SHOP_SOLO`},
|
||||
{text: 'DUO', callback_data: `SHOP_DUO`},
|
||||
{text: 'GROUP', callback_data: `SHOP_GROUP`}
|
||||
{text: 'GROUP', callback_data: `SHOP_GROUP`},
|
||||
{text: 'ADMIN', callback_data: `SHOP_ADMIN`}
|
||||
]
|
||||
]))
|
||||
]).resize())
|
||||
});
|
||||
|
||||
shop.action(`SHOP_DUO`, async (ctx) => {
|
||||
@ -54,6 +55,30 @@ shop.action(`SHOP_GROUP`, async (ctx) => {
|
||||
ctx.reply(`Еще не доступно.`)
|
||||
});
|
||||
|
||||
|
||||
|
||||
shop.action(`DEBUG_PVE`, async (ctx) => {
|
||||
let user = await UserModel.findByPk(ctx.from.id)
|
||||
let skill = await SkillsModel.findByPk(ctx.from.id)
|
||||
ctx.session.enemy = {
|
||||
name: 'Полицейский',
|
||||
hp: 100,
|
||||
armor: 100
|
||||
}
|
||||
return ctx.scene.enter('NEWPVE')
|
||||
});
|
||||
|
||||
|
||||
|
||||
shop.action(`SHOP_ADMIN`, async (ctx) => {
|
||||
let user = await UserModel.findByPk(ctx.from.id)
|
||||
if(user.status != 'admin') return ctx.editMessageText(`Написано же ADMIN блять.`)
|
||||
return ctx.editMessageText('Admin Panel', Markup.inlineKeyboard([
|
||||
[{text: 'New PVE', callback_data: `DEBUG_PVE`}],
|
||||
[{text: 'Убить охранника [Владение оружием]', callback_data: `SHOP_GUARD_KILL`}]
|
||||
]))
|
||||
});
|
||||
|
||||
shop.action(`SHOP_SOLO`, async (ctx) => {
|
||||
let property = await PropertyModel.findByPk(ctx.from.id);
|
||||
if(property.equipment != 0){
|
||||
@ -133,7 +158,7 @@ shop.action(`SHOP_GUARD_KILL`, async (ctx) => {
|
||||
ctx.session.stage = 'SHOP_GUARD_KILL'
|
||||
ctx.session.enemy = {
|
||||
name: 'Охранник',
|
||||
hp: 100,
|
||||
hp: 1000,
|
||||
armor: 20
|
||||
}
|
||||
return ctx.scene.enter('PVE')
|
||||
@ -199,6 +224,8 @@ shop.action(`SHOP_CASH_SMASH`, async (ctx) => {
|
||||
let user = await UserModel.findByPk(ctx.from.id)
|
||||
let skill = await SkillsModel.findByPk(ctx.from.id)
|
||||
let chance = rand(0, 100)
|
||||
let cashIn = rand(1000, 10000)
|
||||
let timer = 1000
|
||||
if(chance < 50) {
|
||||
ctx.editMessageText('Вы разбили кассовый аппарат, и сработала сигнализация.')
|
||||
ctx.session.stage = 'SHOP_CASH_SMASH'
|
||||
@ -207,11 +234,34 @@ shop.action(`SHOP_CASH_SMASH`, async (ctx) => {
|
||||
hp: 100,
|
||||
armor: 100
|
||||
}
|
||||
for(i=0; i<rand(3,10);i++){
|
||||
setTimeout(() => {
|
||||
cashIn += rand(1000, 10000)
|
||||
ctx.editMessageText(`⏏️ Вы достали из кассы: Ð${cashIn}`)
|
||||
}, timer)
|
||||
timer += 500
|
||||
}
|
||||
setTimeout(() => {
|
||||
user.dirtymoney += cashIn
|
||||
user.save()
|
||||
return ctx.editMessageText(`Вы достали из кассы Ð${cashIn}, пора валить.`)
|
||||
}, timer+300)
|
||||
return ctx.scene.enter('PVE')
|
||||
}
|
||||
return ctx.editMessageText('Вы разбили кассовый аппарат и достали кэш, пора валить.', Markup.inlineKeyboard([
|
||||
[{text: 'Завершить ограбление', callback_data: `SHOP_END`}]
|
||||
for(i=0; i<rand(3,10);i++){
|
||||
setTimeout(() => {
|
||||
cashIn += rand(1000, 10000)
|
||||
ctx.editMessageText(`⏏️ Вы достали из кассы: Ð${cashIn}`)
|
||||
}, timer)
|
||||
timer += 500
|
||||
}
|
||||
setTimeout(() => {
|
||||
user.dirtymoney += cashIn
|
||||
user.save()
|
||||
return ctx.editMessageText(`Вы достали из кассы Ð${cashIn}, пора валить.`, Markup.inlineKeyboard([
|
||||
[{text: 'Завершить ограбление', callback_data: `SHOP_END`}]
|
||||
]))
|
||||
}, timer+300)
|
||||
});
|
||||
|
||||
shop.action(`SHOP_CASH_BREAK_SUCCESS`, async (ctx) => {
|
||||
|
19
utils/drop.js
Normal file
19
utils/drop.js
Normal file
@ -0,0 +1,19 @@
|
||||
module.exports = (items) => {
|
||||
// Сумма всех droprate в массиве
|
||||
let total = 0;
|
||||
// Цикл по всем предметам и добавление их droprate к общей сумме
|
||||
for (let item of items) {
|
||||
total += item.droprate;
|
||||
}
|
||||
// Случайное число от 0 до total
|
||||
let random = Math.random() * total;
|
||||
// Цикл по всем предметам и вычитание их droprate из random
|
||||
for (let item of items) {
|
||||
random -= item.droprate;
|
||||
// Если random стал отрицательным или равным нулю, значит этот предмет выпал
|
||||
if (random <= 0) {
|
||||
console.log(item.hit)
|
||||
return item;
|
||||
}
|
||||
}
|
||||
}
|
@ -13,6 +13,7 @@ const setCooldown = require('./setCooldown')
|
||||
const weaponShopUpdate = require('./weaponShopUpdate')
|
||||
const stats = require('./stats')
|
||||
const escapeHTML = require('./html-escape')
|
||||
const drop = require(('./drop'))
|
||||
|
||||
module.exports = {
|
||||
spaces,
|
||||
@ -29,5 +30,6 @@ module.exports = {
|
||||
setCooldown,
|
||||
weaponShopUpdate,
|
||||
stats,
|
||||
escapeHTML
|
||||
escapeHTML,
|
||||
drop
|
||||
}
|
@ -16,7 +16,7 @@ module.exports = (user, seconds, type) => {
|
||||
cooldown.endTime = Math.trunc(Date.now() / 1000 + (seconds/100*50))
|
||||
break;
|
||||
case `admin`:
|
||||
cooldown.endTime = Math.trunc(Date.now() / 1000)
|
||||
cooldown.endTime = Math.trunc(Date.now() / 1000 + 5)
|
||||
break;
|
||||
}
|
||||
cooldown.timeLeft = cooldown.endTime - cooldown.currentTime
|
||||
|
Loading…
Reference in New Issue
Block a user