in sort/item_container.go [92:183]
func (c *ItemContainer) Assembly() (ret []*module.Item) {
newItems := make([]*module.Item, c.size)
for _, slot := range c.itemMap {
// 第一轮优先只处理 SortByRandomStrategy, 防止后续需要移动元素位置
if slot.sortStrategy != SortByRandomStrategy {
continue
}
var itemSet []*module.Item
if len(slot.items) >= slot.size {
itemSet = append(itemSet, slot.items[:slot.size]...)
slot.index = slot.size
} else {
itemSet = append(itemSet, slot.items...)
slot.index = len(slot.items)
}
for _, item := range itemSet {
index := rand.Intn(c.size)
i := index
if newItems[i] != nil {
for i = (index + 1) % c.size; i != index; i = (i + 1) % c.size {
if newItems[i] == nil {
break
}
}
}
if newItems[i] == nil {
newItems[i] = item
}
}
}
for _, slot := range c.itemMap {
// 第二轮不再处理 SortByRandomStrategy, 已经在第一轮处理过
if slot.sortStrategy == SortByRandomStrategy {
continue
}
var itemSet []*module.Item
if len(slot.items) >= slot.size {
itemSet = append(itemSet, slot.items[:slot.size]...)
slot.index = slot.size
} else {
itemSet = append(itemSet, slot.items...)
slot.index = len(slot.items)
}
i := 0
for _, item := range itemSet {
for i < c.size && newItems[i] != nil {
i++
}
if i >= c.size {
break
}
newItems[i] = item
i++
}
}
for _, item := range newItems {
if item != nil {
ret = append(ret, item)
}
}
// if ret size not enough
if len(ret) < c.size {
diff := c.size - len(ret)
var diffItems []*module.Item
// first use ItemDefaultName slot
if slot, ok := c.itemMap[ItemDefaultName]; ok {
if len(slot.items) > slot.index {
diffItems = append(diffItems, slot.items[slot.index:]...)
}
}
if len(diffItems) < diff {
for name, slot := range c.itemMap {
if name != ItemDefaultName {
if len(slot.items) > slot.index {
diffItems = append(diffItems, slot.items[slot.index:]...)
}
}
}
}
if len(diffItems) > diff {
diffItems = diffItems[:diff]
}
ret = append(ret, diffItems...)
}
return
}