// ==UserScript==
// @name BRDTS_AutoKeyboardScript
// @namespace http://tampermonkey.net/
// @version 0.01
// @description 新版BR大逃杀全键盘操作脚本
// @author f1stSea
// @compatible chrome
// @compatible firefox
// @license GNU
// @match http://s2.dtsgame.com/game.php
// @match http://s1.dtsgame.com/game.php
// @require http://code.jquery.com/jquery-1.11.0.min.js
// @grant none
// ==/UserScript==
(function() {
'use strict';
// 全局变量
// 脚本整体开启/关闭
var isScriptEnabled = true;
// 自动搜刮战利品
var autoSpoil = false;
// 初始化
var run = function() {
initSettingsBox();
}
function initSettingsBox() {
// 寻找主界面
var mainBox;
if ($("td[rowspan='2']").length > 0) {
mainBox = $("td[rowspan='2']").parent();
}
// 创建脚本展示框
var content = $('<td>').attr('rowspan', '2').appendTo(mainBox);
var table = $('<table>')
.attr('border', '1')
.attr('width', '250')
.attr('height', '550')
.attr('cellspacing', '0')
.attr('cellpadding', '0')
.appendTo(content);
var tbody = $('<tbody>').appendTo(table);
var tr = $('<tr>').appendTo(tbody);
var td = $('<td>')
.attr('valign', 'top')
.addClass('b3')
.css('text-align', 'left')
.appendTo(tr);
var div = $('<div>').attr('id', 'log').appendTo(td);
var span = $('<span>')
.addClass('yellow b')
.css('letter-spacing', '2px')
.appendTo(div);
// 主按钮及描述
appendBaseCheckBox(span);
// 自动搜刮
appendAutoSpoilCheckBox(span);
}
function appendBaseCheckBox(span) {
// 添加描述文本到 span 中
span.append('启用脚本: ');
// 添加勾选框到 span 中
var checkbox = $('<input>')
.attr('type', 'checkbox')
.appendTo(span);
checkbox.prop('checked', isScriptEnabled);
// 键盘监控器
var handleKeyDown;
// 定时器
var timer;
if (isScriptEnabled) {
handleKeyDown = startListenKeyboard();
timer = updateTimer(timer, 100);
}
// 监听勾选框的改变事件
checkbox.on('change', function() {
if ($(this).prop('checked')) {
// 开始监听键盘事件
handleKeyDown = startListenKeyboard();
timer = updateTimer(timer, 100);
} else if (handleKeyDown) {
// 停止监听键盘事件
window.removeEventListener('keydown', handleKeyDown);
timer = updateTimer(timer, 0);
}
});
// 添加描述文本到 span 中
span.append(
'<br/><br/>' +
'基础功能快捷键:<br/>' +
'确认--空格<br/>' +
'探索--q<br/>' +
'自动拾取开启/关闭--TAB<br/><br/>' +
'移动:<br/>' +
'灯塔--1 源二郎池--2<br/>' +
'消防署--3 观音堂--4<br/>' +
'清水池--5 森林地带--6<br/>' +
'诊所--7 隧道--8<br/><br/>'
);
}
// 更新定时器
function updateTimer(timer, interval) {
if (timer !== null) {
clearInterval(timer);
timer = null;
}
if (interval > 0) {
timer = setInterval(confirm, interval);
}
return timer;
}
function startListenKeyboard() {
var handleKeyDown = function(e) {
if (document.activeElement.type == 'text' || document.activeElement.type == 'password' || e.metaKey || e.ctrlKey || e.target.isContentEditable || document.designMode === "on") {
console.log('block key:' + e.e.keyCode);
return;
}
if (listenKeyboardMap[e.keyCode]) {
console.log('active key:' + e.keyCode);
//触发映射
listenKeyboardMap[e.keyCode]();
//无效化按键原来的效果
e.preventDefault();
e.stopPropagation();
} else {
console.log('useless key:' + e.keyCode);
return;
}
};
window.addEventListener('keydown', handleKeyDown, false);
return handleKeyDown;
}
var listenKeyboardMap = {
// 空格:32 确认
'32': function() {
confirm();
},
// 1:49 移动到灯塔
'49': function() {
moveTo(20);
},
// 2:50 移动到源二郎池
'50': function() {
moveTo(17);
},
// 3:51 移动到消防署
'51': function() {
moveTo(5);
},
// 4:52 移动到观音堂
'52': function() {
moveTo(6);
},
// 5:53 移动到清水池
'53': function() {
moveTo(7);
},
// 6:54 移动到森林地带
'54': function() {
moveTo(16);
},
// 7:55 移动到诊所
'55': function() {
moveTo(19);
},
// 8:56 移动到隧道
'56': function() {
moveTo(11);
},
// q:81 探索
'81': function() {
pressButtonIfExist("探索");
},
// TAB:9 开启/关闭自动拾取
'9': function() {
dontSpoil = !dontSpoil;
},
};
function appendAutoSpoilCheckBox(span) {
// 添加描述文本到 span 中
span.append('自动搜刮战利品: ');
// 添加勾选框到 span 中
var checkbox = $('<input>')
.attr('type', 'checkbox')
.appendTo(span);
checkbox.prop('checked', autoSpoil);
// 监听勾选框的改变事件
checkbox.on('change', function() {
autoSpoil = $(this).prop('checked');
});
// 添加描述文本到 span 中
span.append(
'<br/>搜刮且仅搜刮金钱、罐头与徽章<br/>'
);
};
function confirm() {
// 合并
if (checkMerge()) {
return;
}
// 无需额外判断直接确认的按钮
if (pressButtonIfExist()) {
return;
}
// 拾取按钮
if (checkPickup()) {
return;
}
// 搜刮尸体有价值部分,无价值部分可自行搜刮,或者快速移动直接离开
if (checkSpoil()) {
return;
}
}
function checkMerge() {
// 可拾取物品
var $inputElement = $('input[type="button"].postbutton[value="确定"]');
var pageText = $("#cmd").text();
if ($inputElement.length > 0 && pageText.includes("合并")) {
sl("itm0");
sl("itm1");
sl("itm2");
sl("itm3");
sl("itm4");
$inputElement.click();
return true;
}
// 不存在该标签
return false;
}
function pressButtonIfExist(value) {
var directConfirmList = ["确定", "提交", "斩刺\\(斩\\)", "投掷\\(投\\)", "射击\\(射\\)"];
if (value) {
directConfirmList = [value];
}
for (var i = 0; i < directConfirmList.length; i++) {
var $inputElement = $('input[type="button"].postbutton[value=' + directConfirmList[i] + ']');
if ($inputElement.length > 0) {
// 存在该标签,触发点击事件
$inputElement.click();
return true;
}
}
// 不存在该标签
return false;
}
function checkPickup() {
// 可拾取物品
var pickupItemSet = new Set([
"杂炊", "松茸", "香菇", "蘑菇", "树枝", "面", "炖肉", " 冰",
"水", "牛奶", "苹果", "清涼饮料", "蔬菜汁",
"强壮剂", "中药", "特效药", "疗伤药", "针筒", "牛奶",
"瑞士刀", "力场", "之盾", "RoseMystica", "胴具足", "针线包",
// "磨刀石", "废金属",
// "手机","电脑",
// "投","绷带",
// "子弹","废金属","钢琴线","铁管",
]);
needArmor(pickupItemSet);
var $pickupElement = $('input[type="button"].postbutton[value="拾取"]');
var $drupElement = $('input[type="button"].postbutton[value="丢弃"]');
if ($pickupElement.length > 0 && $drupElement.length > 0) {
// 存在该标签,判断是否是目标物品
var pageText = $("#cmd").text();
// 遍历目标字,判断是否存在
var have = false;
pickupItemSet.forEach(function(item) {
if (pageText.includes(item)) {
have = true;
return true;
}
});
have ? $pickupElement.click() : $drupElement.click();
return true;
} else {
return false;
}
}
// 没有防具会拾取对应防具,有的话就不拾取了,高价值防具在默认拾取列表,不在此列
function needArmor(pickupItemSet) {
var need = false;
var targetTdElement = $("#main");
if (!pickupItemSet) {
pickupItemSet = new Set();
}
if (targetTdElement.text().includes("【防具(体)】\n无")) {
// console.log("没有【防具(体)】");
need = true;
pickupItemSet.add("体");
}
if (targetTdElement.text().includes("【防具(头)】\n无")) {
// console.log("没有【防具(头)】");
need = true;
pickupItemSet.add("头");
}
if (targetTdElement.text().includes("【防具(腕)】\n无")) {
// console.log("没有【防具(腕)】");
need = true;
pickupItemSet.add("腕");
}
if (targetTdElement.text().includes("【防具(足)】\n无")) {
// console.log("没有【防具(足)】");
need = true;
pickupItemSet.add("足");
}
return need;
}
function checkSpoil() {
// 可拾取尸体
var pageText = $("#cmd").text();
if (autoSpoil && pageText.includes("尸体") && pageText.includes("军")) {
if (pageText.includes("罐头") || pageText.includes("元") || pageText.includes("碎片")) {
sl("itm0");
sl("itm1");
sl("itm2");
sl("itm3");
sl("itm4");
sl("money");
postCommand();
return true;
} else {
postCommand();
return true;
}
}
return false;
}
function moveTo(id) {
var locationMap = {
"1": "北海岸(A-2)",
"2": "北村住宅区(B-4)",
"3": "北村公所(C-3)",
"4": "邮电局(C-4)",
"5": "消防署(C-5)",
"6": "观音堂(C-6)",
"7": "清水池(D-4)",
"8": "西村神社(E-2)",
"9": "墓地(E-4)",
"10": "山丘地带(F-6)",
"11": "隧道(E-8)",
"12": "西村住宅区(F-2)",
"13": "寺庙(F-9)",
"14": "废校(G-3)",
"15": "南村神社(G-6)",
"16": "森林地带(H-4)",
"17": "源二郎池(H-6)",
"18": "南村住宅区(I-6)",
"19": "诊所(I-7)",
"20": "灯塔(I-10)",
"21": "南海岸(J-6)",
"22": "神秘研究所(H-8)"
}
$('#moveto').val(id);
postCommand("command", "move");
}
// hack
//update time
function updateTime(timing, mode) {
if (timing) {
t = timing;
tm = mode;
h = Math.floor(t / 3600);
m = Math.floor((t % 3600) / 60);
s = t % 60;
// add a zero in front of numbers<10
h = checkTime(h);
m = checkTime(m);
s = checkTime(s);
$('#timing').html(h + ':' + m + ':' + s);
tm ? t++ : t--;
setTimeout("updateTime(t,tm)", 1000);
} else {
window.location.href = 'index.php';
}
}
//icon select
function iconMover() {
var gd = document.valid.gender[0].checked ? 'm' : 'f';
var index = document.valid.icon.selectedIndex;
var inum = document.valid.icon[index].value;
''
$('#iconImg').html('<img src="' + pic_root + gd + '_' + inum + '.gif" alt="' + inum + '">');
}
function dniconMover() {
dngd = document.cmd.dngender[0].checked ? 'm' : 'f';
dninum = document.cmd.dnicon.selectedIndex;
$('#dniconImg').html('<img src="' + pic_root + dngd + '_' + dninum + '.gif" alt="' + dninum + '">');
}
function postCommand(mode, command, other) {
for (var id in other) {
if (id != 'toJSONString') {
$('#cmd').append('<input type="hidden" name="' + id + '" value="' + other[id] + '">');
}
}
if (mode != undefined) {
$('#cmd').append('<input type="hidden" name="mode" value="' + mode + '">');
}
if (command != undefined) {
$('#cmd').append('<input type="hidden" name="command" value="' + command + '">');
}
$('#submit').attr("disabled", true);
var oXmlHttp = zXmlHttp.createRequest();
var sBody = getRequestBody(document.forms['cmd']);
oXmlHttp.open("post", "command.php", true);
oXmlHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
oXmlHttp.onreadystatechange = function() {
if (oXmlHttp.readyState == 4) {
if (oXmlHttp.status == 200) {
showGamedata(oXmlHttp.responseText);
$('#submit').attr("disabled", false);
} else {
showNotice(oXmlHttp.statusText);
}
}
};
oXmlHttp.send(sBody);
}
function transformMoveList() {
var options = $('#moveto option');
var html = "<div id='moveto_trans' class='select'><div class='options'>"
if (options.length > 0) {
options.each(function() {
var title = $(this).html();
var value = $(this).attr('value');
html += "<div value='" + value + "'>" + title + "</div>";
$(this).html();
});
}
html += "</div></div>";
$('#moveto').remove();
$('#cmd').prepend(html);
$('#moveto_trans').css('position', 'absolute');
$('#moveto_trans').css('left', $('.postbutton').position().left + 10);
$('#moveto_trans').css('top', $('.postbutton').position().top - 25);
$('.select .options div').each(function() {
var type = $(this).attr('value');
if (type != 'main') {
$(this).hide();
}
$(this).click(function() {
var value = $(this).attr('value');
if (value == 'main') {
$(this).siblings().toggle();
} else {
postCommand('command', 'move', {
moveto: value
});
}
})
})
}
function showGamedata(sGamedata) {
gamedata = sGamedata.parseJSON();
if (gamedata['url']) {
window.location.href = gamedata['url'];
} else if (!gamedata['main']) {
window.location.href = 'index.php';
}
if (gamedata['team']) {
$('#team').val(gamedata['team']);
gamedata['team'] = '';
}
for (var id in gamedata) {
if ((id == 'toJSONString') || (!gamedata[id])) {
continue;
}
$('#' + id).html(gamedata[id]);
console.log(id);
}
if (DEBUGMODE == 99) {
transformMoveList();
}
}
function showNotice(sNotice) {
$('#notice').html(sNotice);
}
function sl(id) {
checkbox = $('#' + id);
// if (checkbox.is(':checked')){$('#submit').click();}
checkbox.click();
}
function showNews(n) {
var oXmlHttp = zXmlHttp.createRequest();
oXmlHttp.open("post", "news.php", true);
oXmlHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
oXmlHttp.onreadystatechange = function() {
if (oXmlHttp.readyState == 4) {
if (oXmlHttp.status == 200) {
showNewsdata(oXmlHttp.responseText);
} else {
showNotice(oXmlHttp.statusText);
}
}
};
oXmlHttp.send('newsmode=' + n);
}
function showNewsdata(newsdata) {
news = newsdata.parseJSON();
if (news['msg']) {
newchat = '';
for (var nid in news['msg']) {
if (nid == 'toJSONString') {
continue;
}
newchat += news['msg'][nid];
}
$('#newsinfo').html(newchat);
} else {
$('#newsinfo').html(news);
}
}
function showAlive(mode) {
window.location.href = 'alive.php?alivemode=' + mode;
}
var refchat = null;
function chat(mode, reftime) {
clearTimeout(refchat);
var oXmlHttp = zXmlHttp.createRequest();
var s = document.forms['sendchat'];
if (mode == 'send') {
s['sendmode'].value = 'send';
} //
sBody = getRequestBody(s);
//alert(sBody);
oXmlHttp.open("post", "chat.php", true);
oXmlHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
oXmlHttp.onreadystatechange = function() {
if (oXmlHttp.readyState == 4) {
if (oXmlHttp.status == 200) {
showChatdata(oXmlHttp.responseText);
} else {
showNotice(oXmlHttp.statusText);
}
}
};
oXmlHttp.send(sBody);
if (mode == 'send') {
$('#chatmsg').val("");
$("#sendmode").val('ref');
}
rtime = reftime;
refchat = setTimeout("chat('ref',rtime)", rtime);
}
function showChatdata(jsonchat) {
chatdata = jsonchat.parseJSON();
if (chatdata['msg']) {
$('#lastcid').val(chatdata['lastcid']);
newchat = '';
for (var cid in chatdata['msg']) {
if (cid == 'toJSONString' || cid == 'parseJSON') {
continue;
}
newchat += chatdata['msg'][cid];
}
/*Code For At*/
Reg = new RegExp("@[\u4E00-\u9FA5A-Za-z0-9_]*", "g");
result = Reg.test(newchat);
if (result == true) {
newchat = newchat.replace(Reg, "<a class='aite' onclick=AiteOther('$&') href='javascript:void(0)'>$&</a>");
}
$('#chatlist').html(newchat + $('#chatlist').html());
if (result == true) {
UpdataAite();
}
}
}
function UpdataAite() {
nickname = $("#nickname").html();
var i = 0;
$("a.aite").each(function() {
if (i < 10) {
var name = $(this).html();
if ("@" + nickname == name) {
$(this).removeClass('aite').addClass('aiteme');
}
}
i++;
});
}
function AiteOther(name) {
if (name != "@" + nickname) {
$("#chatmsg").val(name + ",");
}
}
run();
})();