DHT堆dht什么属性性会稳点

> 资讯 > 7.0大秘境职业心得分享 DHT通关十层天赋属性解析
7.0大秘境职业心得分享 DHT通关十层天赋属性解析
7.0大秘境职业心得分享 DHT通关十层天赋属性解析
本周大秘境
昨天带门童宝宝(840MS)的时候一时兴起带着门童宝宝打了10层。
队友只有DH和我是固定队的。FS和WS是临时认识的。MS是个门童宝宝。
过程是。当时尝试过8层直接冲到11层。因为一波队友ADD没处理好。所以最后是23分钟左右打完的(21分钟3箱)。
这周大米BUFF是暴怒+死蛆+坚韧 小怪30%血狂暴+100%伤害/小怪和BOSS近战攻击减少T的被治疗效果可叠加/小怪+40%血量+20%伤害。
感觉比上周难。这个死蛆对DHT也不太友好。
打个10层也没啥可自豪的。感觉努努力还能更好。毕竟还有那么多大神。12 13层的大神还是轻喷。
副本难度顺序个人认为7层以上:英灵、黑心、巢穴》回廊、地窟、黑鸦、群星》艾萨拉、噬魂。
英灵小怪普遍恶心。近战怪多。老一死蛆不出连续招架很难成功消除,灭点在老一和小怪。
黑心豹子各种秒杀血少的后排、熊怪堪比BOSS、小鹿+花的几波怪强烈推荐隐形跳过 太浪费时间、龙BOSS挺考验治疗。前面豹子一定不要ADD。组野人心里苦(可能我们打的少把。反正豹子跳一下。血少的2个后排就直接跪地板。前面ADD浪费了不少时间)。
巢穴的蝎子和盘子怪我不做评价了。
黑鸦总体来说不是特别难。处理好小怪。基本都吃控制。没有难成BOSS一样的小怪。胖子BOSS注意消除死蛆。
回廊个人感觉这周不是很难、唯一难点在将军BOSS。tank一定要风筝好而且不能踩地上的东西,小蝙蝠下来要瞬间打掉不然一下就10几层死蛆,2术士+高个恶魔卫士建议控2SS单打掉恶魔卫士。
地窟,难度不是特别高。老一注意一下风筝死蛆。老二出JB脸小怪的那一波开YY。
群星,小怪也是有点凶残的。老二前面挺考验治疗和DPS。
艾萨拉 噬魂。基本靠着经验就能顺利通过,很简单。
其他的细节。我会在详细攻略中仔细为大家介绍。
这周的密境。T的位置很关键。我是单T打的。如果有人双T能打出好效果也是不错的方法。
单T的话。死蛆一定要盯好层数。是时候就要风筝。尖刺也最好留一层。debuff还剩2 3秒的时候开个尖刺拼脸招架。大跳一次都不要用来打输出。很关键。
昨天10层黑心。就打了一次。超时了10分钟拿了个低保。其实感觉这个队伍我们配合完美。都吃合剂卡药水的话。打到11-12层也是有可能性的。主要还是小怪灭太多次。
小怪的血量真的恶心。豹子蹦一下后排就差不多150-200W伤害。随便一个都是W血。2个熊简直比BOSS还凶。狂暴一下一个小朋友。打了说实话这周不想再碰。
先说明:高层密境以及团本,我全是用的这一套天赋
大家应该有看过我之前的帖子。那些讨论是建立在实战前的。今天建立在实战后的总结。与之前可能有所改变。
第一层大家喜欢用第三个锋锐之刺风筝。我不反对的。只是我队友火法+浩劫战刃大师。减速比我这个给力多了。我就完全没必要选择这个天赋了。多此一举。
火刑仍然没有选择。看过我之前的帖子的朋友也知道传染的烙印是没有什么伤害加强的。光火刑的奏效速度并不是很快。有时候想拿来抗关键的2-3秒,传染速度实在墨迹。不如产碎片来的快。
(刚出烙印鞋子。火刑搭配烙印鞋子。5人本收益还不错)。
邪能之刃我还是以自己的手感为主。产怒效率最高。并且大跳这周很关键。我不愿意点出中间天赋输出。(选择冲撞天赋也是可行的。两者因人而异)。
这周死蛆喂食恶魔高层完全碾压吸血(之前信仰的变身吸血这周还是放弃了)。
锁链最后还是点出来了。因为有些地方为了抢时间我都是拉着2波怪。或者很多只。锁链可以伪打断一次法系读条。并且聚怪配合队友控制,H2眼球的软泥。这个技能简直神技。
邪能毁灭输出和回血在群怪还是客观的。单体可以选择中间。
最后一层很关键:个人观点-----灵魂壁障优于春哥 先说密境:高层密境我都选择的是壁障。这周的死蛆。壁障能大大减缓你的压力。10层。我基本都没有先倒过。风筝时机把握得好。很难倒。
小怪狂暴没减伤没控制没风筝压力过于大的时候出了春哥没吸血一样还是要被打死的。
况且壁障可以吃下不少BOSS的特殊技能。平缓血线。高层密境BOSS的重击技能比团本还凶残。不带壁障缓冲一下你就见底(比如说噬魂老1.一次重击250W法伤。你的减伤是完全没办法完美覆盖每次重击的)。
团本方面:H1 壁障能在T跑点名的时候配合结界完美抵挡爆炸伤害 H2 壁障能在支配狂乱以及大怪射线时缓冲很多伤害 H3壁障T小蜘蛛。吃斜掠之爪时效果拔群。
H4能很好的抵挡2层压制+咆哮+平A的一套连招,冲锋后的换坦也更得心应手 H6的梦魇之矛。这个我就不多说了把。
我现在的看法就是:个人认为H团本的BOSS战中。春哥没有必要、高层密境可以选择。
(个人观点。因人而异。仅供参考。如果压力过大。选择春哥也是完全没问题的)
装备也是这几天肝3箱肝的。为了堆装等。这几天属性也杂了。
在精通削弱之后。个人感觉。精通仍然是DHT的第一属性。堆全能是不靠谱的。尖刺减伤仍然是核心。攻强的提升也非常稳定。
第二属性的争论很多。急速还是暴击呢。我说说我的看法把。
急速。减少尖刺CD为主。让你GCD变快为辅(GCD方面其实提升并不大)主要看重的就是尖刺覆盖。精通如今的削弱已经同时削弱了急速的收益了。尖刺的覆盖率如今个人感觉靠着堆急速并不是很划得来。
有了喂食,急速堆不堆。我感觉实战中影响是真的不大。再说一遍是真的不大。
况且急速收益递减非常快。越堆收益越低。
现在的装备基本都是偏向一个属性的2/3基本都堆了精通。1/3堆急速不如级2/3堆急速有效果。堆了然后呢?没减伤。没攻强。没治疗。你说GCD转的快了。那我告诉你不堆个上万把的急速。GCD提升纯属扯淡。
暴击作为副属性。首先数值不会很高。他能提供一定的招架和回复暴击率。在奶妈不能照顾的时候。或者吃到BOSS重击技能的时候紧跟一发60怒暴击裂劈回满都是常事。
扛过高层密境的大多数DHT心里我估计都多多少少知道,招架这个属性很重要,小怪多了。招架的优势非常明显。死蛆消不消很大程度就看你最后的2 3秒招架不招架。
想安安心心的过密境和团本。第一属性精通是不可少的。削弱了仍然是精通。第二属性我的看法说的很清楚了,作为一个数值并不是主堆的属性,选择暴击还是急速。看你自己了。
这版本所有的T饰品。包括5人本的DPS饰品(包括魔暴龙 时光碎片)我已经全部收集齐。
1号饰品位置:卡牌》萨维斯》黑心关底 一个常驻减伤的SP对DHT很重要,卡牌位置暂时无人能替代。880的其他饰品我都觉得可能不如850卡牌。
2号饰品位置:艾萨拉老一耐力》萨维斯雕像》暗夜井残渣》冰龙》高装号角 以前觉得耐力饰品差。现在神器起来之后感觉耐力饰品是极品。主要是这个的耐力吃神器百分比加成,而且能弥补DHT生命值低的不足。
饰品方面就这样。希望大家能从中得到启发。或者从迷茫中找到方法。
手机看攻略,电脑玩游戏两不误!
加点再也不需要切来切去啦~
【魔兽世界(new)】最新消息第一时间推送给你
与相关的文章有:1您所在的位置: &
用Python教你如何“养”一只DHT爬虫
用Python教你如何“养”一只DHT爬虫
文讲的是要实现一个爬虫, 所以不会跟协议文档那么严格. 只要保证你能正确请求,回应即可. 用软件开发的一句话来说: 只要接口一致, 管你内部细节代码是怎么写的.
废话少说, 直接上菜.
我假设你了解:
1, DHT协议
2, 网络字节序/主机字节序
3, bencode
5, 种子文件构造
不懂的赶紧去google, 要是缺一个, 我会一口盐汽水喷死你的!
最重要的是, 你必须会编程!!!!!!! 必须会!!!!!!!!!!!
ok, DHT原理是什么我在这就不写了, 毕竟会看我这文章的人都是已经知道了的.
本文贴的代码均为Python, 使用其他编程语言的人可以看注释. 为了简单, 只会说大概思路和关键性代码, 细节自行搞定.
本文讲的是要实现一个爬虫, 所以不会跟协议文档那么严格. 只要保证你能正确请求,回应即可. 用软件开发的一句话来说: 只要接口一致, 管你内部细节代码是怎么写的.
第一步, 构建自己的路由表, 这里涉及到大量Python代码, 请深呼吸:
在构建自己的路由表之前, 得写两个辅助函数, 后面会用到:
from&hashlib&import&sha1 &from&random&import&randint &def&node_id(): &&&&&&&&&&&&&&&&&&&hash&=&sha1() &&&&&s&=&&& &&&&&for&i&in&range(20): &&&&&&&&&s&+=&chr(randint(0,&255)) &&&&&hash.update(s) &&&&&return&hash.digest() &&def&intify(nid): &&&&&&&&&&assert&len(nid)&==&20&&&&&return&long(nid.encode('hex'),&16)&&
协议里说道, table里有bucket, bucket里有node, 每个bucket有K个node, 目前K=8, 即每个bucket有8个node. 由于table范围是0到2的160次方, 那么一个table最多能有(2的160次方)/K那么多的bucket.
OK, 按照OOP编程思想来说, 那么肯定会有table, bucket, node这3个类, 无OOP的, 自己看着办.
由于是基于Kademila而写, 所以我习惯上把这三个类名变为KTable, KBucket, KNode:
class&KNode: &&&&&def&__init__(self,&nid,&ip,&port): &&&&&&&&&&&&&&&&&&&&&self.nid&=&nid&&&&&&&&&&self.ip&=&ip &&&&&&&&&self.port&=&port &&&&&&&&&&&def&__eq__(self,&other): &&&&&&&&&return&self.nid&==&other.nid &&&&&def&__ne__(self,&other): &&&&&&&&&return&self.nid&!=&other.nid &&&class&KBucket: &&&&&def&__init__(self,&min,&max): &&&&&&&&&&&&&&&&&&&&&&&&&self.min&=&min&&&&&&&&&&self.max&=&max&&&&&&&&&&self.nodes&=&[]&&&&&&&&&&self.last_accessed&=&time()&&&&&&&def&nid_in_range(self,&nid): &&&&&&&&&&&&&&&&&&return&self.min&&=&intify(nid)&&&self.max &&&&&&def&append(self,&node): &&&&&&&&&&&&&&&&&&&&&&&&&if&len(node.nid)&!=&20:&return&&&&&&&&&if&len(self.nodes)&&&8: &&&&&&&&&&&&&if&node&in&self.nodes: &&&&&&&&&&&&&&&&&self.nodes.remove(node) &&&&&&&&&&&&&&&&&self.nodes.append(node) &&&&&&&&&&&&&else: &&&&&&&&&&&&&&&&&self.nodes.append(node) &&&&&&&&&&&&&self.last_accessed&=&time() &&&&&&&&&else: &&&&&&&&&&&&&raise&BucketFull &&&class&KTable: &&&&&&&&&&&&def&__init__(self,&nid): &&&&&&&&&&&&&&&&&&&&&self.nid&=&nid&&&&&&&&&&self.buckets&=&[KBucket(0,&2&**&160)]&&&&&&&def&append(self,&node): &&&&&&&&&&&&&&&&&&&&&&&&&&&&if&node.nid&==&self.nid:&return& &&&&&&&&&&&&&&&&&&&index&=&self.bucket_index(node.nid) &&&&&&&&&bucket&=&self.buckets[index] &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&try: &&&&&&&&&&&&&bucket.append(node) &&&&&&&&&except&BucketFull: &&&&&&&&&&&&&if&not&bucket.nid_in_range(self.nid):&return&&&&&&&&&&&&&&self.split_bucket(index)& &&&&&&&&&&&&&self.append(node) &&&&&&def&bucket_index(self,&nid): &&&&&&&&&&&&&&&&&&&&&&&&for&index,&bucket&in&enumerate(self.buckets): &&&&&&&&&&&&&if&bucket.nid_in_range(nid): &&&&&&&&&&&&&&&&&return&index &&&&&&&&&return&index&&&&&&&& &&&&&&def&split_bucket(self,&index): &&&&&&&&&&&&&&&&&&&&&&&&&&&old&=&self.buckets[index] &&&&&&&&&point&=&old.max&-&(old.max&-&old.min)/2&&&&&&&&&new&=&KBucket(point,&old.max) &&&&&&&&&old.max&=&point &&&&&&&&&self.buckets.insert(index&+&1,&new) &&&&&&&&&for&node&in&old: &&&&&&&&&&&&&if&new.nid_in_range(node.nid): &&&&&&&&&&&&&&&&&new.append(node) &&&&&&&&&for&node&in&new: &&&&&&&&&&&&&old.remove(node)&&&&&&&& &&&&&&def&find_close_nodes(self,&target): &&&&&&&&&&&&&&&&&&&&&&&&&nodes&=&[] &&&&&&&&&if&len(self.buckets)&==&0:&return&nodes &&&&&&&&&index&=&self.bucket_index(target) &&&&&&&&&nodes&=&self.buckets[index].nodes &&&&&&&&&min&=&index&-&1&&&&&&&&&max&=&index&+&1&&&&&&&&&while&len(nodes)&&&K&and&(min&&=&0&or&max&&&len(self.buckets)): &&&&&&&&&&&&&if&min&&=&0: &&&&&&&&&&&&&&&&&nodes.extend(self.buckets[min].nodes) &&&&&&&&&&&&&if&max&&&len(self.buckets): &&&&&&&&&&&&&&&&&nodes.extend(self.buckets[max].nodes) &&&&&&&&&&&&&min&-=&1&&&&&&&&&&&&&max&+=&1&&&&&&&&&&num&=&intify(target) &&&&&&&&&nodes.sort(lambda&a,&b,&num=num:&cmp(num^intify(a.nid),&num^intify(b.nid))) &&&&&&&&&return&nodes[:K]&&
ok, 路由表这个玩意儿比较有技术含量, 又难以描述, 所以会贴代码演示. 接下来的DHT客户端/服务端就不再贴那么多的代码了, 毕竟处理网络的代码太多太复杂, 技术含量不高, 按照DHT协议描述的那样操作就行了.
第二步, 实现DHT客户端
实现一个DHT客户端, 不用都要实现ping, find_node, get_peers, announce_peer操作了, 做一个爬虫, 仅仅只需要实现find_node功能就能达到目的了. 因为我们只想不停地交朋友而已.
要想加入DHT网络, 首先得认识第一个已知的node, 这个node最好是长期在线的, 又稳定的. 我这里就认识一个, :6881, 由于UDP的原因, 只能接受ip, 所以请提前解析出ip地址.
然后使用DHT协议说的那个find_node操作, 现在解释一下某些key的潜在意义吧
t: transaction ID的简称, 传输ID. 起什么作用呢? 由于UDP无3次握手这个机制, 所以任何人都可随便发送信息给你, 根本就不需与你提前进行连接. 想想这么个情况, 你发送了一请求数据给某node, 然后收到DHT说的回复类型的数据, 即y=r, 但是, 你怎么知道回应的是你之前的哪个请求呢? 所以就要靠t了, 当你发送时, t=aa的话, 对方回应这个请求时, 回应消息的t绝对是aa, 这样你就能区分了. 在发送之前, 要为该t值注册一个处理函数, 当收到回应时, 调用该函数进行处理. 记得设置一个定时器, 时间一到, 立马删除该函数, 不然你内存飙升. 如果超时后才收到信息的话, 很遗憾, 没了处理函数, 直接忽略. 我建议定时器设定到5秒. 当然, 随便你. 一定要保证成功收到第一个node的find_node回复, 不然失败, 就没法继续find_node了.即: 认识不到第一个朋友, 就别想认识第二个朋友.
id: 就是自身node ID了, 是node_id()函数生成的哈, 样子绝不是DHT协议例子中的样子, 这主要是为了方便演示而已
target: 这个也是自身的node ID, 作用是问某node离我最近的都有哪些node.
收到对方回复后, 把那key为nodes给解析出来, 按DHT协议说的, 每个node是以4字节ip+2字节port+20字节node ID组成, 那么nodes的字节数就会是26的倍数. &解码&node和&编码&node的Python代码如下:
from&struct&import&unpack &&def&num_to_dotted(n): &&&&&d&=&256&*&256&*&256&&&&&q&=&[] &&&&&while&d&&&0: &&&&&&&&&m,&n&=&divmod(n,&d) &&&&&&&&&q.append(str(m)) &&&&&&&&&d&/=&256&&&&&return&'.'.join(q) &&def&decode_nodes(nodes): &&&&&n&=&[] &&&&&nrnodes&=&len(nodes)&/&26&&&&&nodes&=&unpack(&!&&+&&20sIH&&*&nrnodes,&nodes) &&&&&for&i&in&range(nrnodes): &&&&&&&&&nid,&ip,&port&=&nodes[i&*&3],&num_to_dotted(nodes[i&*&3&+&1]),&nodes[i&*&3&+&2] &&&&&&&&&n.append((nid,&ip,&port)) &&&&&return&n &&decode_nodes函数的反作用函数如下: &def&dotted_to_num(ip): &&&&&hexn&=&''.join([&%02X&&%&long(i)&for&i&in&ip.split('.')]) &&&&&return&long(hexn,&16) &&def&encode_nodes(nodes): &&&&&n&=&[] &&&&&for&node&in&nodes: &&&&&&&&&n.extend([node.nid,&dotted_to_num(node.ip),&node.port]) &&&&&return&pack(&!&&+&&20sIH&&*&len(nodes),&*n)&
解析出来后, 插入到路由表里, 然后使用find_node继续向刚解析出来的node进行请求, target还是自身node ID, 以此循环. 这样就能认识很多很多的node啦. 细节就不说了, 自己看着办.
第三步, 实现DHT服务器端, 协议文档说得很清楚了, 我只列出几个需要注意的问题:
1, 服务器端得实现处理node发来的ping, find_node, get_peers, announce_peer请求.
2, 回应信息里的t的值是对方的t值, 不是自己随便写的.
3, 最好要实现那个token机制, 这样就减少被捣乱的几率, 此token就按协议那种方式就行, 每5分钟变换一次, 10分钟内的有效.
4, 一定要记得前面说的那句&当该bucket负责的node有请求, 回应操作; 删除 添加 更新 等这些操作时, 那么就刷新该bucket&.
5, 由于是做DHT爬虫, 所以处理get_peers请求和find_node请求差不多一样, 都是返回最近的node. 当然, 你闲得蛋疼的话, 可以来得标准点, 做能返回peers那种, 不过, 没必要.
6, announce_peer请求里的port就是对方提供下载种子的端口, 监听于TCP, 不是DHT连接的端口. 还有请求消息里的id就仅仅指的是对方的node ID, 我看博客园某人写的文章说是对方的peer ID, 我表示很不解.
第四步, 定时刷新路由表
按协议所说, 过一段时间后, 路由表里的node不全都是活跃了, 所以要定时刷新路由表. 说下大概思路, 遍历路由表中的bucket列表, 看看bucket的last_accessed是不是超过了比如说15分钟, 如果超过了, 说明有可能不&新鲜&了, 那么从该bucket随机选择一个node, 向该node发送find_node操作, 接着就不管了. 笔者为了简单, 就采用这么简单的方式了, 没有去确认可疑node是否还&活&着. 你可以严格按照协议文档那么写.
你可能会问的问题:
1, 怎么知道一个资源的下载速度?
答: 有句话这么说: 下载人数越多, 下载速度越快. 那么, 如果某一个资源的infohash出现的announce_peer次数越高, 那么就说明下载人数就越多, 人数越多就越快. 这个下载速度就没法用绝对速度表示, 不过可以使用相对速度.
2, 怎么在众多的资源中过滤出影视资源?
答: 得到种子, 如果有files字段话, 遍历它进行正则匹配, 看看有木有后缀名是rmvb, avi, mp4等什么的, 如果有, 那它大部分情况就是影视了. 如果没有files字段, 就对name字段进行正则匹配吧.
3, 为什么那些影视资源总是些&很黄很暴力&?
答: 这个就不是很清楚了, 我想, 使用BT的人大多数都是些撸管男吧.
4, infohash这个词是根据什么而来的?
答: 种子文件中info字段的hash值
5, 如何认识更多的node?
答: 多开启几个node实例.
6, 什么情况下, 对方把我给加入到对方的路由表里?
答: 当你向对方find_node时. 也许你的ping, get_peers也能让对方把你添加到路由表里. 同理, 当你接到ping, find_node, get_peers时, 就把对方给添加到路由表里, 至少收到find_node请求时, 就要把对方给添加到路由表里.
7, 如何长期保存node?
答: 数据库, 文件都行, 我不建议长期保存node, 你只要一直在线, 使用内存存储最好不过了, 速度快, 代码简单.
原文链接:
【编辑推荐】
【责任编辑: TEL:(010)】
关于&&的更多文章
编程领域在这几年里迎来了翻天覆地的变化,如果说C、C++、Java在
网友评论TOP5
我个人有着多年开源文档相关经验,而过去十年中此类创作与出版的方式发生了巨大变革。其中某些趋势似乎是种循环,例如评议标记的再度流行。
讲师: 0人学习过讲师: 35人学习过讲师: 58人学习过
Java 8版本最大的改进就是Lambda表达式,其目的是使Ja
美国旧金山时间3月31日,在红木城Oracle公司总部,Ora
从2006年12月份Sun发布Java 6后,经过五年多的不懈努
《游戏开发核心技术--剧本和角色创造》分“剧本”、“角色”和“游戏玩法”三部分,第一部分着重说明故事的历史、一般故事元素、
51CTO旗下网站

我要回帖

更多关于 dht堆什么 的文章

 

随机推荐