hxp
4 天以前 c3bbd3b0263fc6c2127cd9f072f497f46f98758b
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerEventCounter.py
@@ -27,50 +27,26 @@
import PlayerCoin
import PlayerControl
import PlayerFamily
import PlayerFamilyZhenfa
import PlayerOnlinePrize
import PlayerLoginDayAward
import NPCCommon
import FunctionNPCCommon
import PlayerGoldGift
import PlayerActivity
import FBCommon
import PlayerSuccess
import PlayerFreeGoods
import ChItem
import GameLogic_Tianzi
import PlayerGoldInvest
import PlayerCrossRealmPK
import PlayerCrossChampionship
import PlayerPet
import PlayerRecover
import PlayerFamilyRedPacket
import OpenServerCampaign
import PlayerCostRebate
import CrossActCTGBillboard
import CrossActAllRecharge
import PlayerActCollectWords
import PlayerActTotalRecharge
import PlayerActGarbageSorting
import PlayerActXianXiaMJ
import PlayerActGubao
import PlayerActHorsePetTrain
import PlayerActLianqi
import PlayerActGodGift
import PlayerActFamilyGCZ
import PlayerActFamilyCTGAssist
import PlayerActRechargeRebateGold
import PlayerActManyDayRecharge
import PlayerActSingleRecharge
import PlayerActRechargePrize
import PlayerActGrowupBuy
import PlayerActTurntable
import PlayerActBossTrial
import PlayerActBuyOne
import PlayerSpringSale
import PlayerBossReborn
import PlayerWeekParty
import PlayerFeastWeekParty
import PlayerFeastTravel
import PlayerFeastLogin
import PlayerFeastWish
import PlayerActTask
@@ -82,47 +58,65 @@
import PlayerFlashGiftbag
import PlayerDailyGiftbag
import PlayerOfflineSupport
import PlayerActHorsePetFeast
import PlayerFeastRedPacket
import PlayerCrossYaomoBoss
import PlayerLuckyCloudBuy
import PlayerLuckyTreasure
import PlayerTongTianLing
import PlayerFlashSale
import PlayerWishingWell
import CrossPlayerData
import PlayerTreasure
import PlayerZhanling
import PlayerLove
import IpyGameDataPY
import PlayerArena
import PyGameData
import PlayerGuaji
import OpenServerActivity
import PlayerXiangong
import PlayerMineArea
import PlayerBillboard
import PlayerViewCache
import GameFuncComm
import PlayerMail
import PlayerHero
import PlayerTree
import PlayerLLMJ
import DBDataMgr
import datetime
import time
## 原GameServer通知的
def GameServer_OnDay(index, tick): return
def GameServer_OnHour(index, tick): return
def GameServer_OnWeek(index, tick): return
def GameServer_OnMonth(index, tick): return
def GameServer_OnYear(index, tick): return
def DoLogic_CrossCenterOnDay(centerEventValue):
    '''收到跨服中心同步的onday事件,注意这里本服的触发跨服中心onday事件
    事件由跨服中心统一管理,跨服中心onday后,会广播同步给所有服务器,包含其他跨服服务器及游戏服
    由于是由跨服中心统一调度的,所以其他服务器可以各自处理各自跨服功能本服的跨服onday逻辑
    【注】常规处理可以无视功能所在跨服与游戏服的onday触发先后顺序,各自处理各自的逻辑即可
    如功能所在跨服管理功能的公共跨服数据onday,游戏服管理玩家自身的onday
    如果个别功能需要先处理公共数据再处理玩家自身数据的,则由功能自己管理,公共数据处理完毕后再同步给对应的游戏服
    '''
    GameWorld.Log("CrossCenterOnDay -> centerEventValue=%s" % centerEventValue)
    PlayerFamily.FamilyCrossCenterOnDay()
    # 其他跨服功能
    # 游戏服额外处理玩家
    if GameWorld.IsMainServer():
        playerManager = GameWorld.GetPlayerManager()
        for i in xrange(playerManager.OnlineCount()):
            curPlayer = playerManager.OnlineAt(i)
            if not GameWorld.IsNormalPlayer(curPlayer):
                continue
            PlayerOnCrossCenterEvent(curPlayer, centerEventValue)
    PlayerBillboard.OnDay(centerEventValue)
    return
def DoLogic_OnDay(tick):
    GameWorld.Log("MapServer -> OnDay!")
    #副本OnDay事件响应
    FBLogic.OnDay(tick)
    #FBLogic.OnDay(tick)
    
    OpenServerActivity.OnDay()
    #仙盟
    PlayerFamily.FamilyOnDay()
    PlayerArena.OnDay()
    GameLogic_Tianzi.OnDay()
    
    PlayerOfflineSupport.OnDay()
    playerManager = GameWorld.GetPlayerManager()
@@ -135,14 +129,20 @@
        PlayerOnDay(curPlayer)
        
    PlayerMail.OnDayEx()
    PlayerControl.RemoveTimeoutLeaveServerPlayerInfo(tick)
    PlayerBillboard.OnDay()
    PlayerViewCache.OnDay()
    return
def DoLogic_CrossCenterOnHour(centerEventValue):
    GameWorld.Log("CrossCenterOnHour -> centerEventValue=%s" % centerEventValue)
    PlayerFamily.FamilyCrossCenterOnHour()
    return
def DoLogic_OnHour(tick):
    GameWorld.Log("MapServer -> OnHour!")
    
    PlayerFamily.FamilyOnHour()
    #副本OnHour事件
    FBLogic.OnHour(time, tick)
    
@@ -161,6 +161,8 @@
def DoLogic_OnWeek(tick):
    GameWorld.Log("MapServer -> OnWeek!")
    PlayerArena.OnWeek()
    
    playerManager = GameWorld.GetPlayerManager()
    for i in xrange(playerManager.GetPlayerCount()):
@@ -230,6 +232,45 @@
    return
#--------------------------------------------------------
def PlayerOnCrossCenterEvent(curPlayer, centerEventValue=0):
    ## 跨服中心过天
    if not centerEventValue:
        centerEventValue = DBDataMgr.GetEventTrigMgr().GetValue(ShareDefine.Def_CrossCenterEvent)
    playerEventValue = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_OnCrossEvent)
    if not playerEventValue:
        playerEventValue = centerEventValue
        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_OnCrossEvent, centerEventValue)
    if playerEventValue == centerEventValue:
        return
    centerEventTime = GameWorld.ChangeStrToDatetime("%s" % centerEventValue, ChConfig.TYPE_Time_Format_YmdH)
    playerEventTime = GameWorld.ChangeStrToDatetime("%s" % playerEventValue, ChConfig.TYPE_Time_Format_YmdH)
    center_Day = centerEventTime.day
    center_Month = centerEventTime.month
    center_Year = centerEventTime.year
    player_Day = playerEventTime.day
    player_Month = playerEventTime.month
    player_Year = playerEventTime.year
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_OnCrossEvent, centerEventValue)
    if (center_Day != player_Day or center_Month != player_Month or center_Year != player_Year):
        PlayerCrossCenterOnDay(curPlayer, centerEventValue)
    return
def PlayerCrossCenterOnDay(curPlayer, centerEventValue):
    playerID = curPlayer.GetPlayerID()
    GameWorld.Log("PlayerCrossCenterOnDay! centerEventValue=%s" % (centerEventValue), playerID)
    PlayerFamily.PlayerCrossCenterOnDay(curPlayer)
    GameWorld.Log("PlayerOnDayCross OK!", playerID)
    return
def PlayerOnDay(curPlayer):
    #记录玩家字典值,待初始化后执行
    if not curPlayer.GetGameServerInitOK():
@@ -243,8 +284,11 @@
    playerID = curPlayer.GetPlayerID()
    GameWorld.Log("PlayerOnDay! ondayValue=%s" % (ondayValue), playerID)
    
    # 过天同步下时间、开服天
    ChPlayer.Sync_PyServerDataTimeToClient(curPlayer)
    ChPlayer.Sync_OpenServerDay(curPlayer)
    __DoPlayerOnDay(curPlayer, ShareDefine.Def_OnEventType)
    __DoPlayerOnDay(curPlayer, ShareDefine.Def_OnEventTypeEx)
    
    GameWorld.Log("PlayerOnDay OK!", playerID)
    return
@@ -255,108 +299,58 @@
        return
    
    # 常规过天
    if onEventType == ShareDefine.Def_OnEventType:
        #开服活动
        OpenServerCampaign.OnOpenServerCampaignDay(curPlayer)
        #清空每日事件奖励
        curPlayer.SetDayProcessGameEventCount(0)
        #重置宠物每天的训练次数
        #PlayerPet.DoLogic_PetInfo_OnDay(curPlayer)
        PlayerOnlinePrize.ResetPrizeInfoOnDay(curPlayer)
        #OnDay时清除每日签到的信息
        PlayerSignDay.SignDayOnDay(curPlayer)
        # 累计登陆礼包登陆次数刷新
        PlayerLoginDayAward.NotePlayerLoginDayCnt(curPlayer)
        #------------------------------------------------------------------------------
        PlayerCoin.OnDay(curPlayer)
        PlayerTree.PlayerOnDay(curPlayer)
        #成就
        PlayerSuccess.SuccOnDay(curPlayer)
        #投资
        PlayerGoldInvest.OnDay(curPlayer)
        #战令
        PlayerZhanling.OnDay(curPlayer)
        #寻宝
        PlayerTreasure.OnDay(curPlayer)
        PlayerGoldGift.OnDay(curPlayer)
        #转盘
        PlayerActTurntable.PlayerOnDay(curPlayer)
        #情缘
        PlayerLove.DoPlayerOnDay(curPlayer)
        #仙宫
        PlayerXiangong.PlayerOnDay(curPlayer)
        PlayerControl.PayCoinOnDay(curPlayer)
        #玩法前瞻奖励
        gameNoticeAwardState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_GameNoticeAwardState)
        if gameNoticeAwardState:
            PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_GameNoticeAwardState, 0)
            ChPlayer.Sync_RewardGetRecordInfo(curPlayer, ChConfig.Def_RewardType_GameNotice, 0)
        #每日分享奖励重置
        shareGameAwardState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ShareGameAwardState)
        if shareGameAwardState:
            PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_ShareGameAwardState, 0)
            ChPlayer.Sync_RewardGetRecordInfo(curPlayer, ChConfig.Def_RewardType_ShareGame, 0)
        #开服每日奖励
        awardState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_OpenSererDailyAward)
        if awardState:
            PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_OpenSererDailyAward, 0)
            ChPlayer.Sync_RewardGetRecordInfo(curPlayer, ChConfig.Def_RewardType_OpenServerDailyAward, 0)
        #开服每日奖励
        awardState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_RechargeDayAward)
        if awardState:
            PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_RechargeDayAward, 0)
            ChPlayer.Sync_RewardGetRecordInfo(curPlayer, ChConfig.Def_RewardType_RechargeDayAward, 0)
    #if onEventType == ShareDefine.Def_OnEventType:
    GameFuncComm.DoFuncOpenLogic(curPlayer)
    #清空每日事件奖励
    curPlayer.SetDayProcessGameEventCount(0)
    #OnDay时清除每日签到的信息
    PlayerSignDay.SignDayOnDay(curPlayer)
    # 累计登陆礼包登陆次数刷新
    PlayerLoginDayAward.NotePlayerLoginDayCnt(curPlayer)
    #------------------------------------------------------------------------------
    PlayerCoin.OnDay(curPlayer)
    PlayerTree.PlayerOnDay(curPlayer)
    #投资
    PlayerGoldInvest.OnDay(curPlayer)
    #战令
    PlayerZhanling.OnDay(curPlayer)
    #寻宝
    PlayerTreasure.OnDay(curPlayer)
    PlayerGoldGift.OnDay(curPlayer)
    #转盘
    PlayerActTurntable.PlayerOnDay(curPlayer)
    #情缘
    PlayerLove.DoPlayerOnDay(curPlayer)
    #仙宫
    PlayerXiangong.PlayerOnDay(curPlayer)
    PlayerControl.PlayerOnDay(curPlayer)
    ChPlayer.PlayerOnDay(curPlayer)
    PlayerActivity.OnDay(curPlayer)
    PlayerLLMJ.PlayerOnDay(curPlayer)
    FunctionNPCCommon.ShopItemOnDay(curPlayer)
    OpenServerActivity.PlayerOnDay(curPlayer)
    # 特殊时间点X点过天
    elif onEventType == ShareDefine.Def_OnEventTypeEx:
        PlayerHero.PlayerOnDay(curPlayer)
        # 资源找回
        PlayerRecover.RecoverOnDay(curPlayer)
        # 仙盟过天
        PlayerFamily.PlayerOnDay(curPlayer)
        # 重置物品每日使用次数
        ChItem.ResetItemUseCntToday(curPlayer)
        # 极品白拿
        PlayerFreeGoods.OnDay(curPlayer)
        #采集次数重置
        NPCCommon.PlayerOnDay(curPlayer)
        #跨服竞技场
        PlayerCrossRealmPK.DoPlayerOnDay(curPlayer)
        #跨服排位
        PlayerCrossChampionship.DoPlayerOnDay(curPlayer)
        #竞技场
        PlayerArena.OnDayEx(curPlayer)
        #福地
        PlayerMineArea.PlayerOnDay(curPlayer)
        #挂机
        PlayerGuaji.PlayerOnDay(curPlayer)
        #特殊时间点过天的,一般是游戏功能,此时立即同步一次跨服玩家数据
        CrossPlayerData.SendMergePlayerDataNow(curPlayer)
    #elif onEventType == ShareDefine.Def_OnEventTypeEx:
    PlayerHero.PlayerOnDay(curPlayer)
    # 仙盟过天
    PlayerFamily.PlayerOnDay(curPlayer)
    # 重置物品每日使用次数
    ChItem.ResetItemUseCntToday(curPlayer)
    # 极品白拿
    PlayerFreeGoods.OnDay(curPlayer)
    #采集次数重置
    NPCCommon.PlayerOnDay(curPlayer)
    #竞技场
    PlayerArena.OnDayEx(curPlayer)
    # 以下为支持两种重置模式切换配置的
    FBCommon.FBOnDay(curPlayer, onEventType)
    #日常活动OnDay
    PlayerActivity.OnDay(curPlayer, onEventType)
    # 商店物品购买兑换OnDay
    FunctionNPCCommon.ShopItemOnDay(curPlayer, onEventType)
    # 仙盟红包OnDay
    PlayerFamilyRedPacket.RedPacketOnDay(curPlayer, onEventType)
    #许愿池
    PlayerWishingWell.OnDay(curPlayer)
    #通天令
    PlayerTongTianLing.OnDay(curPlayer, onEventType)
    #bossƾ֤
    PlayerActBossTrial.PlayerOnDay(curPlayer, onEventType)
    #任务活动
    PlayerActTask.OnDay(curPlayer)
    #登录活动
@@ -441,25 +435,17 @@
        
        #计算这一周的家族的活跃度
        CalcFamilyActiveValue(curPlayer)
        #成就Onweek
        PlayerSuccess.OnWeek(curPlayer)
        
        # 每周提示玩家提示vip等级加入贵宾俱乐部
        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_HasVIPClubNote, 0)
        FunctionNPCCommon.ShopItemOnWeek(curPlayer)
        
    elif onEventType == ShareDefine.Def_OnEventTypeEx:
        #竞技场
        PlayerArena.OnWeekEx(curPlayer)
        PlayerFamily.OnWeekEx(curPlayer)
        
    # 以下为支持两种重置模式切换配置的
    FBCommon.FBOnWeek(curPlayer, onEventType)
    #日常活动OnWeek
    PlayerActivity.OnWeek(curPlayer, onEventType)
    # 商店物品购买兑换OnDay
    FunctionNPCCommon.ShopItemOnWeek(curPlayer, onEventType)
    return
#---------------------------------------------------------------------
@@ -500,8 +486,6 @@
        pass
        #OnMonthEx
        
    # 商店物品购买兑换OnMonth
    FunctionNPCCommon.ShopItemOnMonth(curPlayer, onEventType)
    return
#---------------------------------------------------------------------
@@ -748,6 +732,9 @@
    #OnYear事件
    if __Get_Can_OnYear(curPlayer):
        PlayerOnYear(curPlayer)
    # 跨服事件检查
    PlayerOnCrossCenterEvent(curPlayer)
    return
@@ -911,14 +898,6 @@
            PyGameData.FBOpenTimeRecord = eval(msgValue)
            return
        
        if key == ShareDefine.Def_Notify_WorldKey_VSFamilyInfo:
            PyGameData.VSFamilyInfo = eval(msgValue)
            return
        if key == ShareDefine.Def_Notify_WorldKey_FamilyZhenfaInfo:
            PlayerFamilyZhenfa.GameServer_FamilyZhenfa(eval(msgValue))
            return
        if key == ShareDefine.Def_Notify_WorldKey_CoupleInfo:
            syncCoupleInfo = eval(msgValue)
            for playerID, coupleInfo in syncCoupleInfo.items():
@@ -943,23 +922,8 @@
            if actionName == ShareDefine.OperationActionName_ExpRate:
                PlayerControl.RefreshOperationAction_ExpRate()
                
            elif actionName == ShareDefine.OperationActionName_CostRebate:
                PlayerCostRebate.RefreshCostRebateActionInfo(actNum)
            elif actionName == ShareDefine.OperationActionName_TotalRecharge:
                PlayerActTotalRecharge.RefreshTotalRechargeActionInfo(actNum)
            elif actionName == ShareDefine.OperationActionName_GarbageSorting:
                PlayerActGarbageSorting.RefreshGarbageSortingActionInfo(actNum)
            elif actionName == ShareDefine.OperationActionName_XianXiaMJ:
                PlayerActXianXiaMJ.RefreshXianXiaMJActionInfo(actNum)
            elif actionName == ShareDefine.OperationActionName_Gubao:
                PlayerActGubao.RefreshGubaoActionInfo(actNum)
            elif actionName == ShareDefine.OperationActionName_HorsePetTrain:
                PlayerActHorsePetTrain.RefreshHorsePetTrainActionInfo(actNum)
                
            elif actionName == ShareDefine.OperationActionName_GodGift:
                PlayerActGodGift.RefreshGodGiftActionInfo(actNum)
@@ -975,15 +939,6 @@
                
            elif actionName == ShareDefine.OperationActionName_SpringSale:
                PlayerSpringSale.RefreshSpringSaleActionInfo(actNum)
            elif actionName == ShareDefine.OperationActionName_BossReborn:
                PlayerBossReborn.RefreshOperationAction_BossReborn()
            elif actionName == ShareDefine.OperationActionName_BossTrial:
                PlayerActBossTrial.RefreshBossTrialActionInfo(actNum)
            elif actionName == ShareDefine.OperationActionName_HorsePetFeast:
                PlayerActHorsePetFeast.RefreshOperationAction_HorsePetFeast(actNum)
                
            elif actionName == ShareDefine.OperationActionName_FlashGiftbag:
                PlayerFlashGiftbag.RefreshFlashGiftbagActionInfo(actNum)
@@ -1005,9 +960,6 @@
                
            elif actionName == ShareDefine.OperationActionName_CollectWords:
                PlayerActCollectWords.RefreshActCollectWordsInfo(actNum)
            elif actionName == ShareDefine.OperationActionName_WeekParty:
                PlayerWeekParty.RefreshOperationAction_WeekParty()
                
            elif actionName == ShareDefine.OperationActionName_BuyCountGift:
                PlayerActBuyCountGift.RefreshBuyCountGiftActionInfo(actNum)
@@ -1033,26 +985,11 @@
            elif actionName == ShareDefine.OperationActionName_FeastWish:
                PlayerFeastWish.RefreshFeastWishActionInfo()
                
            elif actionName == ShareDefine.OperationActionName_FeastTravel:
                PlayerFeastTravel.RefreshFeastTravelActionInfo()
            elif actionName == ShareDefine.OperationActionName_FeastWeekParty:
                PlayerFeastWeekParty.RefreshOperationAction_FeastWeekParty()
            elif actionName == ShareDefine.OperationActionName_FeastRedPacket:
                PlayerFeastRedPacket.RefreshOperationAction_FeastRedPacket()
            elif actionName == ShareDefine.OperationActionName_LuckyTreasure:
                PlayerLuckyTreasure.RefreshLuckyTreasureAction()
                
            elif actionName == ShareDefine.OperationActionName_RechargePrize:
                PlayerActRechargePrize.RefreshRechargePrizeActionInfo()
            elif actionName == ShareDefine.OperationActionName_GrowupBuy:
                PlayerActGrowupBuy.RefreshGrowupBuyActionInfo()
            elif actionName == ShareDefine.OperationActionName_RechargeRebateGold:
                PlayerActRechargeRebateGold.RefreshRechargeRebateGoldActionInfo()
                
            return
        
@@ -1068,50 +1005,10 @@
                #GameWorld.DebugLog("跨服服务器地图,不处理")
                return
            
            if actionName == ShareDefine.CrossActName_CTGBillboard:
                CrossActCTGBillboard.RefreshCrossActCTGBillboardInfo()
            elif actionName == ShareDefine.CrossActName_AllRecharge:
                CrossActAllRecharge.RefreshCrossActAllRechargeInfo()
            elif actionName == ShareDefine.CrossActName_BossTrial:
                PlayerActBossTrial.RefreshCrossActBossTrialInfo()
            elif actionName == ShareDefine.CrossActName_XianXiaMJ:
                PlayerActXianXiaMJ.RefreshCrossActXianXiaMJInfo()
            elif actionName == ShareDefine.CrossActName_Gubao:
                PlayerActGubao.RefreshCrossActGubaoInfo()
            elif actionName == ShareDefine.CrossActName_HorsePetTrain:
                PlayerActHorsePetTrain.RefreshCrossActHorsePetTrainInfo()
            elif actionName == ShareDefine.CrossActName_Lianqi:
                PlayerActLianqi.RefreshCrossActLianqiInfo()
            elif actionName == ShareDefine.CrossActName_FamilyGCZ:
                PlayerActFamilyGCZ.RefreshActFamilyGCZInfo()
            return
        
        if key == ShareDefine.Def_Notify_WorldKey_CrossZoneName:
            PyGameData.g_crossZoneName = msgValue
            return
        if key == ShareDefine.Def_Notify_WorldKey_CrossServerTime:
            PyGameData.g_crossServerTimeInfo = eval(msgValue)
            playerManager = GameWorld.GetPlayerManager()
            for index in xrange(playerManager.GetPlayerCount()):
                curPlayer = playerManager.GetPlayerByIndex(index)
                if not GameWorld.IsNormalPlayer(curPlayer):
                    continue
                ChPlayer.Sync_PyServerDataTimeToClient(curPlayer)
            return
        # 幸运云购
        if key == ShareDefine.Def_Notify_WorldKey_LuckyCloudBuyInfo:
            PyGameData.g_luckyCloudBuyInfo = eval(msgValue)
            PlayerLuckyCloudBuy.OnLuckyCloudBuyChange()
            return
        
        if msgValue.isdigit():
@@ -1140,16 +1037,6 @@
    # elif key == ShareDefine.Def_Notify_WorldKey_MapServerScriptReloadVersion:
    #    ReloadModule.DoMapServerScriptReload(value, tick)
    #===============================================================================================
    # 跨服PK
    elif key == ShareDefine.Def_Notify_WorldKey_CrossPKSeasonID:
        PlayerCrossRealmPK.OnCrossRealmPKSeasonChange(value)
    # 跨服妖魔boss
    elif key == ShareDefine.Def_Notify_WorldKey_CrossDailyActionState % ShareDefine.CrossDailyActionID_YaomoBoss:
        if gameWorldMgr.GetGameWorldDictByKey(key) != value:
            PlayerCrossYaomoBoss.OnYaomoBossStateChange(value, tick)
    #通用设置
    befValue = gameWorldMgr.GetGameWorldDictByKey(key)
    gameWorldMgr.SetGameWorldDict(key, value)